按第二个自定义帖子类型标题排序自定义帖子类型管理屏幕

时间:2015-10-10 作者:LeonardShelby

enter image description here

我有两种自定义帖子类型:产品和品牌。产品段塞为“eproduct”。品牌的鼻涕虫是“品牌列表”。在产品管理页面上,我添加了一个列出品牌名称的自定义列。我正在尝试使“Brand”自定义列可按品牌标题(与该产品关联的品牌自定义帖子类型的post\\u标题)排序。这是我到目前为止使用的代码posts_clauses 滤器

add_filter(\'posts_clauses\', \'vendia_sort_brand_column\',10,2);
function vendia_sort_brand_column( $clauses, $query ) {
global $wpdb;

if ( ! $query->is_main_query()
    || ! is_admin()
    || ! $query->get(\'post_type\') == \'eproduct\'
){
    return $clauses;
}

$clauses[\'orderby\'] = " {$wpdb->posts}.post_title ";

return $clauses;
}
如上所示,我尝试修改orderby SQL查询的参数,使用post_clauses 滤器

$clauses[\'orderby\'] = " {$wpdb->posts}.post_title";

我的绊脚石是“品牌”和“产品”自定义帖子类型都在wp\\u posts表中。所以{$wpdb->posts}.post_title 返回产品标题,而不是我尝试订购的品牌标题。因此,我的产品管理页面只是按产品标题排序,而不是按品牌标题排序。

我想做的就是这样

$clauses[\'orderby\'] = " {$wpdb->posts}.post_title WHERE {$wpdb->posts}.post_type = \'brand-listing\'";

关键的变化是我添加了WHERE {$wpdb->posts}.post_type = \'brand-listing\'ORDERBY 条款然而,这显然不是有效的SQL。我的查询返回0篇帖子,因此我的产品管理屏幕没有列出帖子。我想是WHERE 不允许在ORDERBY 条款还是这样?

我是SQL的新手,所以我想知道,什么是有效的SQLORDERBY 条款来完成我想做的事情?

我感谢任何回复的人,感谢他们的帮助。我已经在这方面工作了好几光年了。

1 个回复
SO网友:bestprogrammerintheworld

这似乎是你的混合鼻涕虫和邮政类型。Slug用于在一些人将页面/帖子输入浏览器时识别页面/帖子(与permalink非常相关)。post类型用于标识存储在wordpress数据库中的帖子类型。

post_clauses 如果要同时更改查询中的多个内容,则使用。我建议使用pre_get_posts 相反(如果您不想执行比排序更复杂的查询)

根据您所写的内容:

$clauses[\'orderby\'] = " {$wpdb->posts}.post_title WHERE {$wpdb->posts}.post_type = \'brand-listing\'";
似乎您只需要自定义帖子类型的orderby帖子brand (不是品牌列表,似乎是鼻涕虫?)

/* Sort posts in wplist admin */
function custom_post_order($query){
    if ( ! $query->is_main_query() || ! is_admin() {return;}

    $post_type = $query->get(\'post_type\');

    if ($post_type == \'brand\') {            
        $query->set( \'orderby\', array(\'title\' => \'ASC\') );
    }

}
add_action(\'pre_get_posts\', \'custom_post_order\');
这行不通。。。

$clauses[\'orderby\'] = " {$wpdb->posts}.post_title WHERE {$wpdb->posts}.post_type = \'brand-listing\'";
。。。因为Wordpress使用orderby-argument 此处包括orderby only.

(我想WP会创建一个类似这样的查询:

order by wp_posts WHERE wp_posts.post_type = \'brand-listing\'
where wp_posts_type = \'post\' //default created by wordpress
因此sql是不正确的(两个where子句))

如果您仍要使用post_clauses 您应该能够使用此选项:

$clauses[\'orderby\'] = "{$wpdb->posts}.post_title";
$clauses[\'where\'] = "{$wpdb->posts}.post_type = \'brand\'";

相关推荐

高级WP查询占用了SQL服务器

我最近为一位房地产经纪人的客户开发了一个网站。项目中包含一个名为listing. 此帖子类型用于他们的所有列表,其他信息存储在postmeta 表通过使用Advanced Custom Fields Pro.在网站的前端,我开发了一个过滤栏,用户可以通过几个过滤器进行选择并提交表单,然后生成一个复杂的WP\\u查询以返回匹配的列表。很简单!虽然大多数搜索都工作得很好,但一些更复杂的搜索将生成占用线程的SQL查询。当数据库需要刷新堆积的所有内容时,服务器基本上会冻结,直到有人终止进程。这在所有环境中都会发生