webentwicklung-frage-antwort-db.com.de

WordPress-Datenbankfehler: [Nicht eindeutige Tabelle/Alias: 'wp_postmeta']

Jemand hat mir freundlicherweise bei einer anderen Frage geholfen, die nun zu dem Problem geführt hat, dass zwei Funktionen einen Datenbankfehler verursachen. Nach dem, was ich gelesen habe, könnte es etwas mit LEFT JOIN und/oder keiner wp_reset_query() oder wp_reset_postdata() zu tun haben. Der Fehler, den ich erhalte, ist:

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

Ich habe es auf zwei Funktionen eingegrenzt:

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

und das andere Wesen:

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

Die erste Funktion ändert die Reihenfolge der Posts in einem Suchergebnis, um sie mit einem bestimmten post_meta über dem Rest zu ordnen.

Die zweite Funktion ist das Hinzufügen von benutzerdefinierten Feldern zur Suchabfrage, anstatt in WordPress nur nach Post-Inhalten und Titeln zu suchen.

Jede Hilfe bei der Lösung des Konflikts wäre sehr dankbar. Wenn ich eine der Funktionen entferne, funktioniert die andere so, wie sie sollte, aber sie funktionieren einfach nicht zusammen. Aus meiner Lektüre gehe ich davon aus, dass dies der Fall ist, weil sie versuchen, dieselbe Abfrage zu bearbeiten.

3
Randomer11

Sie zwei JOIN-Elemente beide mit der gleichen Tabelle. Wenn Sie eine Tabelle mehr als einmal verbinden müssen, müssen Sie jede Verbindung eindeutig machen, indem Sie dem Tabellenalias einen Namen geben. Wenn WP die gesamte Abfrage durchführt, wird dies berücksichtigt, aber Sie haben Ihren eigenen Code hinzugefügt, der dies nicht tut.

Also, erste Funktion:

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

Dadurch wird der Postmeta-Tabellen-Alias ​​'cfmeta' festgelegt und im ON verwendet.

Und der zweite:

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

Verwenden Sie "cfmeta" anstelle von "wp_postmeta".

Mailand

3
Milan Petrovic