我正在尝试创建一个自定义帖子查询,用于对投票结果为“竖起大拇指”的帖子进行排序。
我将我的自定义“wp\\u post\\u投票”表(存储每个帖子收到的投票数)与默认的“wp\\u posts”表合并并显示帖子WHERE votes > 1
.
WHERE原因导致SQL错误。当我移除posts_where
过滤器我没有收到任何错误,但我的所有帖子都会显示出来,无论它们的投票数是多少。
add_filter(\'posts_join\', \'vote_join\' );
add_filter(\'posts_where\', \'vote_where\' );
function vp_join( $join )
{
global $wpdb;
if (isset($_GET[\'vote_sort\'])) { //when visitor browses voted posts
$join .= " LEFT JOIN wp_post_votes ON " .
$wpdb->posts . ".ID = wp_vote_posts.vote_post_id ";
}
return $join;
}
function vp_where( $where )
{
if (isset($_GET[\'vp_sort\'])) {
$where = "voted > 1";
}
return $where;
}
//custom permalinks code follows...
我在索引中得到的SQL错误是。。
WordPress数据库错误:[]选择t,tt从wp\\u terms AS t内部连接wp\\u term\\u分类法AS tt ON tt。term\\u id=t.term\\u id内部将wp\\u term\\u关系连接为tr ON tr.term\\u taxonomy\\u id=tt。term\\u taxonomy\\u id,其中tt。按t.name ASC排序(\'category\')中的分类法和(0)中的tr.object\\u id
..在我的侧边栏中,我有一个最近发布的小部件。我通过$wpdb->show_errors();
WordPress数据库错误:[您的SQL语法有错误;请查看与您的MySQL server版本相对应的手册,以了解可在第1行使用的接近“投票>1 ORDER BY wp\\u posts.post\\u date DESC LIMIT 0,5”的正确语法]选择SQL\\u CALC\\u FOUND\\u ROWS wp\\u posts。*从wp\\u posts左侧加入wp\\u vote\\u posts ON wp\\u posts。ID=wp\\U vote\\U posts。vote\\u post\\u id,其中1=1按wp\\u posts投票>1顺序。post\\u日期描述限制0,5
我注意到了WHERE 1=1 voted > 1
.. 不确定这是否导致了错误以及如何修复。
最合适的回答,由SO网友:Rarst 整理而成
应该是:
$where .= " AND voted > 1";
其他注意事项:
应使用硬编码表名,而不是硬编码表名$wpdb->prefix . \'post_votes\'
;
代替签入全局$_GET
您应该声明过滤器接受两个参数和相应的代码函数,这些过滤器作为包含所有查询数据的第二个参数对象传递。
类似于:
add_filter(\'posts_where\', \'vote_where\', 10, 2 );
function vote_where( $where, $query ) {
if( isset( $query->query_vars[\'vp_sort\'] ) );
$where .= \' AND voted > 1\';
return $where;
}