【问题标题】:Date product custom field usage in Woocommerce WC_Product_Query在 Woocommerce WC_Product_Query 中使用日期产品自定义字段
【发布时间】:2021-05-06 11:54:42
【问题描述】:

我有一个 woocommerce 网站,我目前正在向该网站添加功能,我的产品有到期日期,并希望在特定页面上显示所有到期日期为今天的产品。除此之外,我还希望将所有到期日期为明天的产品显示在另一个页面上。

我在网上找到了以下文档:Adding Custom Parameter Support

我已通过 sn-ps 插件将其添加到我的网站,并针对我的到期日期属性对其进行了修改

/** * Handle a custom 'expirydate' query var to get products with the 'expirydate' meta.
 * @param array $query - Args for WP_Query.
 * @param array $query_vars - Query vars from WC_Product_Query.
 * @return array modified $query
 */

function handle_custom_query_var( $query, $query_vars ) {
if ( ! empty( $query_vars['expirydate'] ) ) {
    $query['meta_query'][] = array(
        'key' => 'expirydate',
        'value' => esc_attr( $query_vars['expirydate'] ),
    );
}

return $query;
}
add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handle_custom_query_var', 10, 2 );

然后我添加了另一个 sn-p,它是创建调用具有今天到期日期的产品的函数,为此我添加了一个短代码,以便在我的网站上我想要的页面上轻松调用它显示出来。

// Display products with expiry date today

function expiry_Date_Today()
{
$todaysdate = date(d/m/Y);

$products = wc_get_products( array( 'expirydate' => 'todaysdate' ) );
}
add_shortcode( 'expirydatetoday', 'expiry_Date_Today');

现在我的问题是,当我在页面上使用简码时,我什么也得不到。只是一片空白的空间。我认为这是因为我需要以显示产品的格式请求输出。我希望它显示为图像、标题和添加到购物车按钮,类似于您在查看类别页面内容时通常会看到的内容。

我在网上搜索过,但找不到此信息,所以有人可以在这里为我指出正确的方向,或者如果我的代码似乎有明显问题,您能否提供帮助?

非常感谢, 经颅磁刺激。

【问题讨论】:

    标签: php wordpress woocommerce product custom-fields


    【解决方案1】:

    更新

    您的代码中有多个错误,您的过期日期应始终设置为'Y-m-d' 兼容的日期格式,以便能够在需要时比较日期。

    尝试以下操作,将从今天开始获得过期产品列表:

    add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handle_custom_query_var', 10, 2 );
    function handle_custom_query_var( $query, $query_vars ) {
        if ( ! empty( $query_vars['expirydate'] ) ) {
            $query['meta_query'][] = array(
                'key'       => 'expirydate',
                'value'     => esc_attr( $query_vars['expirydate'] ),
                'compare'   => '=',
                'type'    => 'DATE'
            );
        }
        return $query;
    }
    
    function get_products_expired_today($atts ) {
        // Extract shortcode attributes
        extract( shortcode_atts( array(
            'date' => date('Y-m-d'), // default date is current date in 'd/m/Y' format
        ), $atts, 'expirydatetoday' ) );
    
        $products = wc_get_products(  array(
            'status'      => 'publish',
            'limit'       => -1,
            'expirydate'  => $date,
        ) );
    
        $html = '<ul class="expired-products">';
    
        // Products loop
        foreach( $products as $product ) {
            $html .= '<li><a href="' . $product->get_permalink() . '">' . $product->get_name() . '</a></li>';
        }
    
        return $html . '</ul>';
    }
    add_shortcode( 'expirydatetoday', 'get_products_expired_today');
    

    代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。


    现在,如果您想获取所有过期产品而不是“今天”产品,您需要首先将所有产品的 expirydate 自定义字段值的日期格式更改为“YYYY`MM-DD”。

    你将不得不改变:

    'compare'   => '=',
    

    到:

    'compare'   => '<=',
    

    它也有效。

    【讨论】:

    • 我今天会试一试,结果会回来的。我投票赞成你的答案,但由于我的代表很低,它可能不会显示 - 谢谢!
    • 嗨,我已经尝试了您提供的第一个代码,它确实使用产品链接填充了产品名称列表,但它显示了我们商店中的所有产品,而不仅仅是那些具有 expirydate 属性的产品和今天一样(2021 年 2 月 2 日)。
    • 我可以确认我已删除所有设置为 d/m/Y 格式的值,并将它们重命名为 YYYY-MM-DD 格式。我还在我的 functions.php 文件中的代码中将日期格式更改为默认的 Y-m-d,但它仍在填充我页面上的所有产品。我实际上只有一种产品,其属性为 expirydate 和值为 2021-02-02,所以我认为它只会显示这一种产品。
    • 谢谢,我已经使用了更新后的代码,但它现在返回一个空白页。我检查了我的属性 slug 是否正确命名为 expirydate,并且我输入的值的格式是否正确 2021-02-02
    • @TMS 对不起,但我已经测试了代码,它可以正常工作...检查您是否删除了所有旧代码。结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2018-01-10
    • 1970-01-01
    • 2015-07-04
    • 2019-06-25
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多