Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php WP按自定义元密钥归档顺序_Php_Wordpress - Fatal编程技术网

Php WP按自定义元密钥归档顺序

Php WP按自定义元密钥归档顺序,php,wordpress,Php,Wordpress,在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-&

在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' );
但我需要通过自定义元密钥订购文章,如
\u my\u meta\u vip
。基于此,我尝试了以下几行,但成功了一半,因为只加载具有定义的自定义元键的文章,其他的都丢失了。我怎样才能解决这个问题

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' );

如何正确地按自定义元键排序文章?

这里的基本问题似乎是查询正在对post和POSTETA表进行内部联接,这就是为什么查询不会返回没有特定post元项的post。你想要的是一个左连接。有关差异的解释,请参见

您应该能够使用
posts\u 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;
});

查看以下主题:可能会给你一个清晰的想法

最终无法找到任何方法列出所有已定义和未定义
\u my\u meta\u VIP
的帖子

在我的解决方案中,所有
\u我的
都填充了
启用的
禁用的
,以下代码执行此任务:

    // 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' );

我看不出它们之间的区别,我的代码也一样(请参阅meta_query is send is assign&send through arrays将不显示未定义
\u my_meta_vip
的帖子。
    // 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' );