webentwicklung-frage-antwort-db.com.de

WP_Tax_Query mit post_tag funktioniert nicht

Mit dem pre_get_posts-Hook möchte ich Nutzern ermöglichen, ihre Suche einzugrenzen, indem sie sie auf Posts mit bestimmten (mehreren) Tags einschränken.

Das ist mein Haken und meine Funktion:

add_filter('pre_get_posts', array($this, 'pre_get_posts'), 0);

function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {
    $query->set( 'post_type', array( 'post', 'resource', 'initiative') );
    if (isset($_GET['tags'])) {
        $tax_query = array(
            array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => $_GET['tags'],
            'operator' => 'AND',
            )
        );
        $tax_query = new WP_Tax_Query($tax_query);
        $query->set('tax_query', $tax_query);
    }
}
return $query;

}

Wie Sie sehen, erweitere ich die Suche auch auf zwei benutzerdefinierte Beitragstypen. In den Ergebnissen einer Suche werden die benutzerdefinierten Beitragstypen korrekt hinzugefügt, und ich kann sie in der generierten Abfrage sehen, sodass ich weiß, dass der Hook und die Funktion korrekt aufgerufen werden. Der post_tag-Teil der Abfrage wird jedoch nicht hinzugefügt.

Das query_vars -Element des WP_Query-Objekts enthält (glaube ich) den tax_query, aber das WP_Query-Objekt enthält seinen eigenen tax_query, der leer ist, und der SQL-Code in der request hat ihn auch nicht. Hier ist ein (etwas reduzierter) var_dump des WP_Query-Objekts:

WP_Query Object (
[query_vars] => Array
    (
        [s] => ecosystem

        [post_type] => Array
            (
                [0] => post
                [1] => resource
                [2] => initiative
            )

        [tax_query] => WP_Tax_Query Object
            (
                [queries] => Array
                    (
                        [0] => Array
                            (
                                [taxonomy] => post_tag
                                [terms] => Array
                                    (
                                        [0] => culture-change
                                        [1] => peace
                                    )

                                [include_children] => 1
                                [field] => slug
                                [operator] => AND
                            )

                    )

                [relation] => AND
            )
        [search_terms_count] => 1
        [search_terms] => Array
            (
                [0] => ecosystem
            )

        [search_orderby_title] => Array
            (
                [0] => jcgy_posts.post_title LIKE '%ecosystem%'
            )

        [order] => DESC
    )

[tax_query] => WP_Tax_Query Object
    (
        [queries] => Array
            (
            )

        [relation] => AND
    )

[query] => Array
    (
        [s] => ecosystem
    )

[request] => SELECT SQL_CALC_FOUND_ROWS DISTINCT jcgy_posts.* FROM jcgy_posts  LEFT JOIN jcgy_postmeta as jcgy_postmeta on jcgy_posts.ID = jcgy_postmeta.post_id AND jcgy_postmeta.meta_key = '_EventStartDate' WHERE 1=1  AND (((jcgy_posts.post_title LIKE '%ecosystem%') OR (jcgy_posts.post_content LIKE '%ecosystem%')))  AND jcgy_posts.post_type IN ('post', 'resource', 'initiative') AND (jcgy_posts.post_status = 'publish' OR jcgy_posts.post_author = 1 AND jcgy_posts.post_status = 'private')  ORDER BY jcgy_posts.post_title LIKE '%ecosystem%' DESC, post_date DESC LIMIT 0, 10

Alle Untersuchungen, die ich durchgeführt habe, zeigen, dass ich meinen Zusatz zur Abfrage richtig strukturiert habe, aber offensichtlich funktioniert etwas nicht. Ich reiße mir die Haare aus. Irgendwelche Ideen?

2
springthistle

Ich habe das Ding zum Laufen gebracht, obwohl ich nicht ganz sicher bin, wie.

Ich habe zwei Änderungen vorgenommen: Den Schritt "Array in Tax_Query-Objekt konvertieren" entfernt (den ich nur eingefügt habe, weil die Verwendung eines Arrays zuvor nicht funktioniert hat). Dem $ query-Objekt wurde eine direkte Zuweisung des Arrays hinzugefügt (anstatt nur die Menge zu verwenden) () Methode).

Meine letzte (Arbeits-) Funktion ist:

function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {

    if (isset($_GET['post_types'])) {
        $query->set( 'post_type', $_GET['post_types']);
    } else {
        $query->set( 'post_type', array( 'post', 'resource', 'initiative') );
    }
    if (isset($_GET['tags'])) {
        $tax_query = array(
            array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => $_GET['tags'],
            'operator' => 'AND',
            )
        );
        $query->set('tax_query', $tax_query); // do I need both of these lines?
        $query->tax_query = $tax_query;       // let's leave them both in for safety
    }
}
return $query;

}

2
springthistle