按类别对搜索结果进行排序

时间:2013-03-22 作者:user1443216

我正在使用此代码按帖子类型和标题对搜索结果进行排序,但我也想按类别进行排序。我该怎么做?

add_filter(\'posts_orderby\',\'my_sort_custom\',10,2);
function my_sort_custom( $orderby, $query ){
    global $wpdb;
    if(!is_admin() && is_search()) 
        $orderby =  $wpdb->prefix."posts.post_type ASC, {$wpdb->prefix}posts.post_title DESC";

    return  $orderby;
}

1 个回复
SO网友:David

我无意中发现了这一点,我在寻找一种解决方案,从WP_Query 根据他们的相关术语,这似乎是这个问题的精髓。(我将回答一般说明下面问题的特殊搜索案例。)

按相关术语对帖子进行排序,所以关键是MySQL函数FIELD() 只需将一个过滤器连接到posts_orderby 结合使用tax_query.

使用tax_query 的参数WP_Query 必须»加入«wp_posts 具有的表格wp_term_relationships 谁的列term_taxonomy_id 我们想订购。

如果不想排队等待特定条款,只需将所有条款作为值传递:

# get all terms of \'category\' ordered by the terms name (default behaviour)
$terms = get_terms( \'category\', array( \'fields\' => \'ids\' ) );
$query_args = array(
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'category\',
            \'field\'    => \'id\',
            \'terms\'    => $terms
        )
    )
);

/**
 * the filter callback
 * removes itself from the applied filter
 *
 * @wp-hook posts_orderby
 * @param string $sql (Default oderby clause)
 * @param WP_Query $query
 * @uses $terms which are allready in the correct order
 * @return string
 */
$orderby_terms = function( $sql, $query ) use ( $terms, &$orderby_terms ) {
    $field = $GLOBALS[ \'wpdb\' ]->term_relationships . \'.term_taxonomy_id\';
    $terms = array_map( \'intval\', $terms );
    $sql = sprintf(
        \'FIELD( %1$s, %2$s ) \',
        $field,
        implode( \', \', $terms )
    );
    remove_filter( current_filter(), $orderby_terms );

    return $sql;
};
add_filter( \'posts_orderby\', $orderby_terms, 10, 2 );
$query = new \\WP_Query( $query_args );
更详细地回答问题:因为您需要tax_query 参数

限制此查询不会获取未分配给任何术语的帖子。这与其他分类法有关category.pre_get_posts 并确保它是主要的搜索查询。

function wpse_91993_order_search( $query ) {

    if ( ! $query->is_main_query() && ! $query->is_search() )
        return;

    $terms = get_terms( \'category\', array( \'fields\' => \'ids\' ) );
    $tax_query_args = array(
        array(
            \'taxonomy\' => \'category\',
            \'field\'    => \'id\',
            \'terms\'    => $terms
        )
    );
    $query->set( \'tax_query\', $tax_query_args );

    /**
     * the filte callback
     * removes itself from the applied filter
     *
     * @wp-hook posts_orderby
     * @param string $sql (Default oderby clause)
     * @param WP_Query $query
     * @uses $terms which are allready in the correct order
     * @return string
     */
    $orderby_terms = function( $sql, $query ) use ( $terms, &$orderby_terms ) {
        $field = $GLOBALS[ \'wpdb\' ]->term_relationships . \'.term_taxonomy_id\';
        $terms = array_map( \'intval\', $terms );
        $sql = sprintf(
            \'FIELD( %1$s, %2$s ) \',
            $field,
            implode( \', \', $terms )
        );
        remove_filter( current_filter(), $orderby_terms );

        return $sql;
    };
    add_filter( \'posts_orderby\', $orderby_terms, 10, 2 );
}
add_action( \'pre_get_posts\', __NAMESPACE__ . \'\\wpse_91993_order_search\' );
But that will ignore pages and attachments which are considered by default in the WordPress search query. 通常甚至没有为分类法注册category. 此时,正确的解决方案取决于您需要做出的一些决定:

是否可以注册分类法category 至岗位类型pageattachment 并确保这些帖子至少链接到默认术语

结束

相关推荐

Wordpress search exact match

我设置了一些搜索过滤器,发现了一些不应该出现在搜索结果中的帖子。进一步研究后,我发现这些帖子与关键字的“部分”匹配。例如,搜索“car”可以将帖子与单词中的“cared”、“carbon”、“scar”以及其他与car匹配的内容进行匹配。我真的希望这只拉柱匹配\'车\'完全。默认情况下wordpress就是这样工作的吗?我已经试过了\'exact\' => true WP\\u Query上的参数,但这使得在使用类别过滤器等时搜索非常具体。如何设置它以使其与关键字完全匹配?