web-dev-qa-db-fra.com

Comment modifier une page d'archive de taxonomie avec un paramètre de recherche?

J'ai taxonomie appelée sujet.

Si l'utilisateur atterrit sur cette page d'archive comme example.com/topics/wordpress/, j'ai besoin de tous les articles qui ont wordpress Word dans le titre ou la description.

J'ai ajouté le code suivant pour le faire.

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

Mais ce n'est pas le travail que je veux. Ce code est fait, tout d’abord, il faut tous les messages de la rubrique Taxonomie puis filtre.

Je veux modifier ce code comme ci-dessous.

Lorsque l'utilisateur atterrit example.com/topics/wordpress/, je ai besoin d'obtenir tous les messages (non seulement dans cette taxonomie) dans mon blog, puis de filtrer pour WordPress Word. Comment modifier le code ci-dessus pour le faire?

2
Ranuka

La solution ci-dessous renvoie les messages associés au nom de terme demandé ou qui utilise le nom du terme dans le titre, l'extrait ou le contenu de l'article.

Notez que nous utilisons le nom de terme lisible par l’homme pour la recherche, pas le terme slug, qui n’est pas idéal pour les recherches car il pourrait être coupé.

Tout d’abord, ajoutez le nom du terme de taxonomie à la requête de recherche et connectez le filtre pour modifier le code SQL de la recherche:

/**
 * 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 );
    }
}

Ensuite, modifiez le code SQL de recherche de manière à ce que les résultats soit la requête de taxe ou la requête de recherche soient renvoyés:

/**
 * 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