WP 按自定义元键归档顺序

Posted

技术标签:

【中文标题】WP 按自定义元键归档顺序【英文标题】:WP archives order by custom meta key 【发布时间】:2015-08-02 09:45:46 【问题描述】:

在 Wordpress 模板的 function.php 下面的代码运行良好

// Function accepting current query
function my_change_order( $query ) 
    // Check if the query is for an archive
    if($query->is_archive())
        // Query was for archive, then set order
        $query->set( 'order' , 'asc' );
    // Return the query (else there's no more query, oops!)
    return $query;

// Runs before the posts are fetched
add_filter( 'pre_get_posts' , 'my_change_order' );

但我需要通过自定义元键(如 _my_meta_vip)来订购文章。基于this answer,我尝试了以下几行,但成功了一半,因为只加载具有定义的自定义元键的文章,其他的则丢失了。我该如何解决?

function my_change_order( $query ) 
    if($query->is_archive())
        $query->set( 'orderby' , 'meta_value' );
        $query->set( 'meta_key' , '_my_meta_vip' );
    return $query;

add_filter( 'pre_get_posts' , 'my_change_order' );

如何通过自定义元键正确排序我的文章?

【问题讨论】:

【参考方案1】:

看起来这里的根本问题是查询正在对帖子和 postmeta 表进行内部联接,这就是查询不返回没有特定帖子元条目的帖子的原因。你想要的是左连接。有关差异的说明,请参阅 this answer。

您应该能够使用posts_join 过滤器将内连接替换为左连接:

add_filter('posts_join', function($join) 
    global $wpdb;

    // Replace inner join with left join
    $search = 'INNER JOIN ' . $wpdb->postmeta;
    $replace = 'LEFT JOIN ' . $wpdb->postmeta;
    $join = str_ireplace($search, $replace, $join);

    return $join;
);

【讨论】:

【参考方案2】:
   function my_change_order( $query ) 
        // Check if the query is for an archive
        if($query->is_archive())
        // Query was for archive, then set order
        $query->set( 'order' , 'asc' );
        $query->set( 'meta_query', array(
            array(
              'key' => '_my_meta_vip'
            )
        ));

        // Return the query (else there's no more query, oops!)
        return $query;
    

看下面的话题:https://wordpress.stackexchange.com/questions/20237/using-meta-query-how-can-i-filter-by-a-custom-field-and-order-by-another-one可能会给你一个清晰的思路

【讨论】:

我看不出区别,我的代码和我的代码一样。 :( 看到 meta_query 是 send 是 assign & send through array 仍然不显示未定义 _my_meta_vip 的帖子。【参考方案3】:

最后找不到任何方法来列出所有定义了_my_meta_VIP 的帖子。

在我的解决方案中,所有_my_meta_VIP 都填充了enableddisabled,下面的代码可以完成这项工作:

    // Function accepting current query
    function my_change_order( $query ) 
        // Check if the query is for an archive
        if($query->is_archive()) 
            // Query was for archive, then set order
            $query->set( 'post_type', 'profile' );
            $query->set( 'orderby' , 'meta_value' );
            $query->set( 'meta_key' , '_my_meta_vip' );
            $query->set( 'order', 'DESC' );
         else 
            // Return the original query for non-archive pages
            return $query;
        
        // Return the query
        return $query;
    
    // Runs before the posts are fetched
    add_filter( 'pre_get_posts' , 'my_change_order' );

【讨论】:

以上是关于WP 按自定义元键归档顺序的主要内容,如果未能解决你的问题,请参考以下文章

使用 dplyr 按自定义顺序排列行

按自定义字典顺序对字符串进行排序

按自定义顺序排序列表

按自定义顺序对数组的php数组进行排序

如何按自定义顺序对 JavaScript 中的数组进行排序? [复制]

在 Eloquent 中按自定义顺序对集合进行排序 [重复]