WordPress数据库错误:[非唯一表/别名:‘wp_postmeta’]

时间:2017-10-18 作者:Randomer11

有人非常友好地帮助我解决了另一个问题,这导致了两个函数导致数据库错误的问题。据我所知,这可能与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仅搜索帖子内容和标题。

如果能帮助解决冲突,我们将不胜感激。如果我删除其中一个函数,另一个函数会正常工作,但它们不会一起工作,从我的阅读中,我认为这是因为它们试图编辑相同的查询?

2 个回复
最合适的回答,由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。

米兰

SO网友:Benjamin Vaughan

如果有人仍在关注此问题,并且无法通过上述出色的解决方案解决此问题,请查看您没有任何显示错误/错误报告代码仍然处于活动状态。

我一直在寻找这个解决方案,似乎下面的这些选项可以调整查询并导致错误。

删除此代码修复了该问题。

ini_set(\'display_errors\', 1);
ini_set(\'display_startup_errors\', 1);
error_reporting(E_ALL);

结束

相关推荐

Custom Search Results Page

我正在尝试创建自定义搜索结果页面。我不允许直接编辑php文件。我一直在使用[include\\u php]短代码来编写尽可能少的php代码。我试图让用户远离默认的“帖子”页面,因此,当用户搜索时,我想要一个自定义页面,将用户链接到我自己构建的页面,而不是相应的帖子页面。有没有办法不用编辑php文件就能做到这一点?