有人非常友好地帮助我解决了另一个问题,这导致了两个函数导致数据库错误的问题。据我所知,这可能与LEFT JOIN
和/或否wp_reset_query()
或wp_reset_postdata()
. 我得到的错误是:
WordPress database error: [Not unique table/alias: \'wp_postmeta\']
SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (567) ) AND ( wp_postmeta.meta_key = \'featured_listing\' ) AND wp_posts.post_type = \'business\' AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'acf-disabled\' OR wp_posts.post_status = \'private\') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 10
我将其缩小为两个功能,一个是:
// Order posts for featured posts first in search and categories
function custom_special_sort( $query ) {
// if is this the main query and is this post type of business
if ( ($query->is_main_query() && is_post_type_archive(\'business\') ) || (is_main_query() && is_tax (\'location\') ) ) {
// order results by the meta_key \'featured_listing\'
$query->set( \'meta_key\', \'featured_listing\' );
$query->set( \'orderby\', \'featured_listing\' );
$query->set( \'order\', \'DESC\' );
}
}
add_action( \'pre_get_posts\', \'custom_special_sort\' );
另一个是:
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=\' LEFT JOIN \'.$wpdb->postmeta. \' ON \'. $wpdb->posts . \'.ID = \' . $wpdb->postmeta . \'.post_id \';
}
return $join;
}
add_filter(\'posts_join\', \'cf_search_join\' );
+
function cf_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\\(\\s*".$wpdb->posts.".post_title\\s+LIKE\\s*(\\\'[^\\\']+\\\')\\s*\\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( \'posts_where\', \'cf_search_where\' );
+
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( \'posts_distinct\', \'cf_search_distinct\' );
第一个函数更改搜索结果中帖子的顺序,使其以高于其他帖子的某个post\\u meta排序。
第二个功能是向搜索查询中添加自定义字段,而不是wordpress仅搜索帖子内容和标题。
如果能帮助解决冲突,我们将不胜感激。如果我删除其中一个函数,另一个函数会正常工作,但它们不会一起工作,从我的阅读中,我认为这是因为它们试图编辑相同的查询?
最合适的回答,由SO网友:Milan Petrovic 整理而成
使用同一个表连接两个元素。当需要多次联接一个表时,需要通过提供表别名使每个联接唯一。当WP进行整个查询时,它会考虑到这一点,但您已经添加了自己的代码,但没有做到这一点。
因此,第一个功能:
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=\' LEFT JOIN \'.$wpdb->postmeta. \' cfmeta ON \'. $wpdb->posts . \'.ID = cfmeta.post_id \';
}
return $join;
}
add_filter(\'posts_join\', \'cf_search_join\' );
这将设置Posteta表别名“cfmeta”,并在中使用它。
第二个:
function cf_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\\(\\s*".$wpdb->posts.".post_title\\s+LIKE\\s*(\\\'[^\\\']+\\\')\\s*\\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (cfmeta.meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( \'posts_where\', \'cf_search_where\' );
使用“cfmeta”而不是wp\\U Posteta。
米兰