如果没有值返回剩余结果,则按META_VALUE对搜索结果页面进行排序

时间:2016-11-07 作者:Nick Taylor

我正在尝试按特定的meta_key. 关键是我需要返回所有结果,即使在meta_key

帖子是属于事件的自定义帖子类型。

已使用以下方法将结果排序为一组特定的自定义帖子类型:

function SearchFilter($query) {
    if (!is_admin() && $query->is_search() ) {
        $query->set(\'post_type\', array( \'event\', \'university\', \'organization\'));
    }
    return $query;
}

add_action(\'pre_get_posts\',\'SearchFilter\', 9999);
还有一些其他筛选正在进行,以便筛选出已通过的事件或设置为自定义字段“off”的事件。如果需要的话,我也可以发布用于这样做的代码。

基本上,我可以使用

$query->set(\'meta_key\', \'wpcf-start-date\');
$query->set(\'orderby\', array(\'meta_value\' => \'ASC\'));
按事件日期排序事件。这很好,但不会返回任何\'\' (我假设为空)在wpcf-start-date 领域

我试着用这个问题的答案:

Order posts by custom field and if custom field is empty return remaining posts

但是,要么我不太了解正在发生的事情,无法定制它以供我使用,要么就是它对我不起作用。

我可以根据要求提供任何其他信息。

任何帮助都将不胜感激!

<小时>

UPDATE:

我又在看我提到的另一个堆栈问题。我有一个有效的方法:

function sortResults( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    $query->set( \'meta_key\', \'wpcf-start-date\' );
    $query->set( \'orderby\', \'meta_value\');
    $query->set( \'order\', \'DESC\');

    add_filter( \'get_meta_sql\', \'filterResults\' );
}
add_action( \'pre_get_posts\', \'sortResults\' );

function filterResults( $clauses ) {
    remove_filter( \'get_meta_sql\', \'filterResults\' );

    // Change the inner join to a left join,
    // and change the where so it is applied to the join, not the results of the query.
    $clauses[\'join\']  = str_replace( \'INNER JOIN\', \'LEFT JOIN\', $clauses[\'join\'] ) . $clauses[\'where\'];
    $clauses[\'where\'] = \'\';

    return $clauses;
}
但与另一个问题一样,这将无日期的事件放在顶部,日期的事件放在底部。另一个问题建议使用两个循环。我的网站上似乎没有两个循环。搜索结果页面是高度定制的。

1 个回复
SO网友:Jonathan Brinley

您可以通过多个元查询来实现这一点。

$query->set( \'meta_query\', [
  \'relation\' => \'OR\',
  \'wpcf-start-date\' => [
    \'key\' => \'wpcf-start-date\',
    \'compare\' => \'EXISTS\',
  ],
 \'no-start-date\' => [
    \'key\' => \'wpcf-start-date\',
    \'compare\' => \'NOT EXISTS\'
  ],
] );
$query->set( \'orderby\', \'wpcf-start-date\' );
$query->set( \'order\', \'ASC\' );
这将告诉WP创建一个查询,该查询将匹配每个帖子,无论is是否具有键,将其设置为左连接,然后对该键的值进行排序,包括那些具有NULL值的键。

相关推荐

Search results for ACF data

是否可以编写查询以仅从一个自定义字段中搜索数据?我有一个名为“讲座”的CPT,我只想搜索名为“关键字”的自定义字段中的数据,我有:<?php $args = array( \'post_type\' => \'lectures\', \'order\' => \'ASC\', \'posts_per_page\' => -1, \'