我有archive-events.php
使用日期格式为YYYYMMDD(20150215)的自定义字段,通过WP\\U查询对自定义帖子类型“事件”进行排序的文件,如下所示:
$args = array(
\'post_type\' => \'events\',
\'posts_per_page\'=> 10,
\'meta_key\' => \'wpcf-sort-events\',
\'orderby\' => \'meta_value_num\',
\'order\' => \'ASC\'
);
$wp_query = new WP_Query( $args );
然后我制作了一个小部件,它显示带有日期链接的自定义日历,通过
add_query_arg
并显示从该日期起存档的事件,如下所示:
$day = I get the day for the calendar before this... 01
$date = I get the full date (Ymd 20150501) from calendar widget to compare
$arrayargs = array(
\'meta_query\' => array(
\'key\' => \'wpcf-sort-events\',
\'value\' => $date,
\'compare\' => \'>=\'
),
);
$output = \'<a href="\' . add_query_arg( $arrayargs ) . \'>\' . $day . \'</a> \';
这将创建如下链接:
http://mediterranean.life/events/?meta_query%5Bkey%5D=wpcf-sort-events&meta_query%5Bvalue%5D=20150501&meta_query%5Bcompare%5D=%3E但我知道all 事件(无论自定义日期)排序ASC类查询archive-events.php
, 它忽略了meta_query
通过链接。。。
我尝试过用这样的完整查询创建链接,但也失败了。。。
$arrayargs = array(
\'post_type\' => \'events\',
\'meta_key\' => \'wpcf-sort-events\',
\'meta_query\' => array(
\'key\' => \'wpcf-sort-events\',
\'value\' => $date,
\'compare\' => \'>=\'
),
\'orderby\' => \'meta_value_num\',
\'order\' => \'ASC\'
);
$output = \'<a href="\' . add_query_arg( $arrayargs ). \'>\' . $day . \'</a> \';
迷失在太空中。。。有什么想法吗?
SO网友:cybmeta
正如您在自定义WP\\u查询中所看到的,您传递的是硬编码的aguments,而不是计算URL中传递的参数,因此它们不会影响结果。
在您的情况下,似乎对归档模板使用自定义查询是一种不好的方式。当您请求存档模板时,存档的事件已被查询,您将拒绝结果并进行新的二次查询。相反,您应该使用pre_get_posts
操作挂钩,在执行主查询之前对其进行更改,以便在存档模板中获得所需的事件,而无需辅助模板。
add_action( \'pre_get_posts\', function( $query) {
if(isset($query->query_vars[\'action\']) && $query->query_vars[\'action\'] == \'search\'){
//Check that is the main query, not secondary, that we are not in admin side
//and check that $query is the for the events archive
if($query->is_main_query() && !is_admin() && is_post_type_archive(\'events\') ) {
//Get the values passed in the URL and pass them to the query
if( ! empty( $_GET[\'meta_query\'] ) ) {
//You may need some validation/sanitization in $_GET[\'meta_query\'] befor use it
$query->set( \'meta_query\', $_GET[\'meta_query\'] );
}
}
}
} );