我一直在尝试使用wordpress wp_query方法,但我的情况是具体的。
我需要选择当月的所有产品,所以这是我的代码
$args = array(
'numberposts' => -1,
'post_type' => 'product',
'meta_query' => array(
'Relation' => 'AND',
array(
'key' => 'wpcf-product_status',
'value' => 'valid',
'compare' => '='
),
array(
'key' => 'wpcf-product-start_date',
'compare' => '=',
'date_query' => array(
array(
'month' => date('m'),
'compare' => '=',
),
),
),
),
);
// get results
$the_query = new WP_Query( $args );
我无法得到确切的结果。
怎么可能只测试日期MONTH就像SQL(WHERE MONTH(wpcf-product-start_date) = MONTH(NOW())
)
有什么想法吗?
答案 0 :(得分:1)
试试这个。并确保' wpcf-product-start_date'具有相同格式的日期(' m')' :)
$m = date('m');
$args = array(
'numberposts' => -1,
'post_type' => 'product',
'meta_query' => array(
'Relation' => 'AND',
array(
'key' => 'wpcf-product_status',
'value' => 'valid',
'compare' => '='
),
array(
'key' => 'wpcf-product-start_date',
'compare' => '=',
'value' => '$m'
),
),
),
);
答案 1 :(得分:1)
如果您要在给定的年中过滤给定的月,您只需计算该月的时间戳期间并使用元查询的相应比较运算符来过滤它。
您可能需要考虑将wpcf-product-start_date
自定义字段值的格式更改为Y-m-d
,Y-m
或m
,具体取决于您的需求。< / p>
您可以使用{added,updated,deleted}_post_meta
挂钩(例如,参见此fine answer)自动保存新的自定义字段,其中包含根据wpcf-product-start_date
时间戳计算的月份数。例如:
add_action( 'added_post_meta', 'b2e_update_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'b2e_update_post_meta', 10, 4 );
function b2e_update_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
if ( 'wpcf-product-start-date' === $meta_key )
{
// avoid infinite loop
remove_action( current_filter(), __FUNCTION__ );
// add/update the corresponding month value
update_post_meta( $post_id,
'wpcf-product-start-month',
date( 'n', $meta_value )
);
}
}
add_action( 'deleted_post_meta', 'b2e_delete_post_meta', 10, 4 );
function b2e_delete_post_meta( $deleted_meta_ids, $post_id, $meta_key,
$only_delete_these_meta_values )
{
if ( 'wpcf-product-start-date' === $meta_key )
{
// avoid infinite loop
remove_action( current_filter(), __FUNCTION__ );
// delete the corresponding month key
delete_post_meta( $post_id, 'wpcf-product-start-month' );
}
}
然后,您可以在元查询中使用wpcf-product-start-month
。
请注意,我在这里使用了wpcf-product-start-date
。不知何故,这没有触发带有元键wpcf-product-start_date
的自定义字段。但如果您对此有疑问,请告诉我。
如果您冒险,您可以使用posts_where
过滤器:
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'wpcf-product_status',
'value' => 'valid',
'compare' => '='
),
array(
'key' => 'wpcf-product-start_date',
'compare' => '=',
'value' => 'replace_me',
),
),
);
add_filter( 'posts_where', 'b2e_posts_where' );
$the_query = new WP_Query( $args );
remove_filter( 'posts_where', 'b2e_posts_where' );
,其中
function b2e_posts_where( $where )
{
$month = 3; // Edit this value
if( FALSE !== stripos( $where, 'replace_me' ) )
{
$from = "CAST(mt1.meta_value AS CHAR) = 'replace_me'";
$to = "MONTH( FROM_UNIXTIME( 1 * mt1.meta_value ) ) = $month
AND YEAR( FROM_UNIXTIME( 1 * mt1.meta_value ) ) > 1970 ";
$where = str_ireplace( $from, $to, $where );
}
return $where;
}
请注意,这假定replace_me
值位于 second 元查询数组项中。
如果重新排序数组项(例如wp_postmeta, mt1, ...
),表名称可能会更改。有可能找到
自动更正表名,但这超出了这个答案的范围。
希望得到这个帮助。
答案 2 :(得分:0)
... OR
您可以将月份开始和月末作为时间戳并使用“BETWEEN”元比较:
例如
$year = date('Y'); $month = date('m')
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$month_start = strtotime($year . '-' . $month . '-1 00:00:00');
$month_end = strtotime($year . '-' . $month . '-' . $days_in_month . ' 23:59:59');
$args = array(
'numberposts' => -1,
'post_type' => 'product',
'meta_query' => array(
'key' => 'wpcf-product-start_date',
'value' => array(
$month_start,
$month_end
),
'compare' => 'BETWEEN'
)
);
...或
$args = array(
'numberposts' => -1,
'post_type' => 'product',
'meta_query' => array (
'relation' => 'AND',
array(
'key' => 'wpcf-product-start_date',
'value' => $month_start,
'compare' => '>='
),
array(
'key' => 'wpcf-product-start_date',
'value' => $month_end,
'compare' => '<='
)
)
)