Woocommerce WC_Product_Query 中日期产品自定义字段的使用

问题描述

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

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

我已通过代码插件将此添加到我的网站,并针对我的到期日期属性进行了修改

/** * 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 );

然后我添加了另一个代码段,用于创建调用具有今天到期日期的产品的功能,为此我添加一个代码,以便在我希望它的页面上轻松地在我的网站上调用显示

// 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');

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

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

非常感谢, TMS。

解决方法

更新

您的代码中有多个错误,您的过期日期应始终设置为 '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'   => '<=',

它也有效。