最佳实践--元查询与POST_子句的“左连接”排序

时间:2013-06-13 作者:Eric Holmes

更多的是一个伪代码问题,而不是实际代码。我有一些自定义的贴子元附加到附件,并为此元创建了一个列表列。meta要么为1,要么为null(未设置),但我正在尝试为所述列启用排序。

有没有办法利用meta_query 对于WP\\u查询,本质上是左连接,在这里我得到所有值(1或null),然后我可以利用orderby=meta_value_num 用于订购?

显然,它的工作方式是连接到posts\\u子句,添加一个连接,并执行orderby-只是好奇在使用直接WP\\u查询功能时这是否可能!

谢谢

2 个回复
最合适的回答,由SO网友:Eric Holmes 整理而成

你可以用任何一种方法!

使用posts_clauses, 手动编写JOIN语句(使用$wpdb->prepare()-注意安全!),并添加/自定义orderby 条款。

使用meta_query 需要做几件事。首先,正如kaiser提到的,您必须使用relation 在内部meta_query 为了让它工作。其次,即使定义了meta\\u查询,您仍然需要指定meta_key 参数,否则orderby=meta\\u值将不起作用。我假设这是因为可以同时发生多个连接,这可能使用不同的元键。

我是如何做到这一点的:

function handle_my_sortable_column( $query ) {
    global $pagenow;
    if( is_admin() && \'upload.php\' == $pagenow && \'my_meta_key\' == get_query_var( \'orderby\' ) ) {
        $query->set( \'meta_query\', array(
            \'relation\' => \'OR\',
            array(
                \'key\' => my_meta_key\',
                \'value\' => null,
                \'compare\' => \'EXISTS\'
            ),
            array(
                \'key\' => \'my_meta_key\',
                \'value\' => \'\', // must be \'\' value, null does not work
                \'compare\' => \'NOT EXISTS\'
            )
        ) );
        $query->set( \'meta_key\', \'my_meta_key\' ); // required for orderby
        $query->set( \'orderby\', \'meta_value_num\' );
    }
}

SO网友:kaiser

您可以使用pre_get_posts 通过回调:

<?php
defined( \'ABSPATH\' ) OR exit;
/** Plugin Name: (#102854) Order Posts by Foo */

add_filter( \'pre_get_posts\', \'wpse_102854_orderby_foo\' );
function wpse_102854_orderby_foo( $query )
{
    if ( 
        ! $query->is_main_query()
        OR ! is_admin()
        OR \'edit.php?post_type=YOUR_POST_TYPE\' !== $GLOBALS[\'parent_file\']
        // Other conditions that force an abort, Example:
        // OR \'foo\' !== $query->get( \'some_query_var\' )
    )
        return $query;

    $query->set( \'orderby\', \'meta_value_num\' );
    // etc.

    return $query;
}

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register