web-dev-qa-db-ja.com

WordPressデータベースエラー:[一意でないテーブル/エイリアス: 'wp_postmeta']

データベースエラーを引き起こす2つの機能というこの問題を今引き起こしている誰かが非常に親切に別の質問を手伝ってくれました。私が読んだものから、それは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

私はそれを2つの機能に狭めました。

// 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_metaでそれらを並べ替えます。

2番目の機能は、単に投稿コンテンツとタイトルを検索するwordpressの代わりに検索クエリにカスタムフィールドを追加することです。

対立を解決するためのどんな助けでも大いに感謝されるでしょう。片方の関数を削除しても、もう片方の関数は正常に動作しますが、一緒には動作しません。同じクエリを編集しようとしているためです

3
Randomer11

2つのJOIN要素が両方とも同じテーブルにあります。 1つのテーブルを複数回結合する必要がある場合は、テーブルの別名を指定して、各結合を一意にする必要があります。 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' );

これはpostmetaテーブルのエイリアス 'cfmeta'を設定し、それをONで使用します。

そして第二のもの:

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' );

Wp_postmetaの代わりに 'cfmeta'を使用してください。

ミラノ

3
Milan Petrovic