我正在创建一个插件,提供一些用户可以发布的服务。用户可以在其自定义管理面板中管理自己的报价。优惠是免费和优质的。如果优惠是特价的,则会高于整个列表中的免费优惠。用户可以每天刷新premium优惠,因此已刷新的优惠将位于列表的顶部。
我是这样想的:出价custom fields "premium"
如果报价为“溢价”,则价值为“2”,否则(免费报价)价值为“1”。
当用户刷新其高级优惠时\'post_modified\'
已更改。
要实现这一点,我必须进行什么样的查询:列表顶部是最新(最新修改日期)的高级优惠(自定义元“premium”等于“2”),下面是其他优惠。
我的实际查询如下所示:
$args = array(
\'post_type\' => \'mycustomposttype\',
\'post_status\' => \'publish\',
\'paged\' => $paged,
\'meta_key\' => \'premium\',
\'orderby\' => \'modified meta_value_num\',
\'order\' => \'ASC\',
\'meta_query\' => array(
array(
\'key\' => \'paid\',
\'value\' => array(\'paid\',\'free\'),
\'compare\' => \'IN\'
)
),
);
但最新的报价在列表的末尾。即使我将订单改为“DESC”。任何帮助(或新方法)都将不胜感激。
SO网友:s_ha_dum
如果我理解您的意思,我相信以下内容将满足您的需要:
function orderby_mod_wpse_140999($orderby) {
remove_action(\'posts_orderby\',\'orderby_mod_wpse_140999\');
global $wpdb;
return $orderby.", {$wpdb->posts}.post_modified DESC";
}
add_filter(\'posts_orderby\',\'orderby_mod_wpse_140999\');
$args = array(
\'meta_key\' => \'premium\',
\'orderby\' => \'meta_value\',
\'order\' => \'ASC\'
);
$q = new WP_Query($args);
var_dump($q->request);
密钥名称可能有误,最好将其重写为
pre_get_posts
动作,类似于:
function orderby_mod_wpse_140999($orderby) {
remove_action(\'posts_orderby\',\'orderby_mod_wpse_140999\');
global $wpdb;
return $orderby.", {$wpdb->posts}.post_modified DESC";
}
add_filter(\'posts_orderby\',\'orderby_mod_wpse_140999\');
function pgp_orderby_mod_wpse_140999($qry) {
if ($qry->is_main_query() && is_archive()) {
$qry->set(\'meta_key\',\'premium\');
$qry->set(\'orderby\',\'meta_value\');
$qry->set(\'order\',\'ASC\');
}
}
add_action(\'pre_get_posts\',\'pgp_orderby_mod_wpse_140999\');
再一次,我猜了一下。对于
pre_get_posts
解决方案代码需要转到允许钩子应用于主查询的地方。