web-dev-qa-db-de.com

So ändern Sie die Taxonomie-Archivseite mit Suchparametern

Ich habe Taxonomie Thema genannt.

Wenn Benutzer diese Archivseite wie example.com/topics/wordpress/ landen, muss ich alle Beiträge ausgeben, die wordpress Word in Titel oder Beschreibung haben.

Dazu habe ich folgenden Code hinzugefügt.

function pp_change_page_layout( $query ) {


    if ( $query->is_main_query()) {        
        if ( is_tax('topics') ){
            $query->set('s' , 'WordPress'); // I hard code the search turm just for the testing purposes. I will take the archive slug.
        }
    }
}
add_action( 'pre_get_posts', 'pp_change_page_layout' );

Das geht aber nicht so wie ich will. Was dieser Code macht, ist, dass er zuerst alle Beiträge im Thema Taxonomie und dann filtert.

Ich möchte diesen Code wie folgt ändern.

Wenn Benutzer example.com/topics/wordpress/ landen, muss ich alle Beiträge (nicht nur in dieser Taxonomie) in meinem Blog abrufen und dann nach WordPress Word filtern. Wie ändere ich den obigen Code, um es zu tun?

2
Ranuka

Die folgende Lösung gibt Beiträge zurück, die dem abgefragten Termnamen oder zugeordnet sind und den Termnamen im Titel, im Auszug oder im Inhalt des Beitrags verwenden.

Beachten Sie, dass wir für die Suche den von Menschen lesbaren Begriff verwenden, nicht den Begriff Slug, der für Suchanfragen nicht ideal ist, da er getrennt werden könnte.

Fügen Sie zunächst den Namen des Taxonomiebegriffs zur Suchabfrage hinzu und verknüpfen Sie den Filter, um die Such-SQL zu ändern:

/**
 * Adds taxonomy term name to search query and wires up posts_search
 * filter to change the search SQL.
 * 
 * @param WP_Query $query The WP_Query instance (passed by reference).
 */
add_action( 'pre_get_posts', 'wpse_add_term_search_to_term_archive' );
function wpse_add_term_search_to_term_archive( $query ) {

    // Bail if this is the admin area or not the main query.
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    // Set the taxonomy associated with our term. Customize as needed.
    $taxonomy_slug = 'genre';

    // Get the term being used.
    $term_slug = get_query_var( $taxonomy_slug );

    if ( is_tax( $taxonomy_slug ) && $term_slug ) {
        // We have the term slug, but we need the human readable name. This
        // will be available in the term object.
        $term_object = get_term_by( 'slug', $term_slug, $taxonomy_slug );

        // Bail if we can't get the term object.
        if ( ! $term_object ) {
            return;
        }

        // Sets this query as a search and uses the current term for our search.
        $query->set( 's' , $term_object->name );

        // Wire up a filter that will alter the search SQL so that the term archive
        // will include search results matching the term name *OR* posts assigned to
        // the term being queried.
        add_filter( 'posts_search', 'wpse_tax_term_posts_search', 10, 2 );
    }
}

Ändern Sie dann die Such-SQL so, dass das Ergebnis entweder die Steuerabfrage oder die Suchabfrage zurückgegeben wird:

/**
 * Change the search SQL so that results in the tax query OR
 * the search query will be returned.
 *
 * @param string   $search Search SQL for WHERE clause.
 * @param WP_Query $wp_query   The current WP_Query object.
 */
function wpse_tax_term_posts_search( $search, $wp_query ) {
    // Replaces the first occurrence of " AND" with " OR" so that results in the 
    // tax query OR the search query will be returned.
    return preg_replace( '/^\s(AND)/', ' OR', $search );
}
2
Dave Romsey