web-dev-qa-db-fra.com

Les requêtes de recherche ne semblent pas fonctionner?

J'ai un problème avec les requêtes de recherche. Chaque fois que vous posez des requêtes supplémentaires, telles que:

mywebsite.com/?s=wordpress&post_type=page

mywebsite.com/?s=wordpress&post_type=page,post

mywebsite.net/?s=wordpress&cat=1

mywebsite.net/?s=wordpress&post_type=post&tag=genesis-post

mywebsite.net/?s=wordpress&post_type=post&tag=thesis-post

il doit faire une recherche dans la portée spécifique (type d'article, catégorie, étiquette).

Dans mon cas, cela ne semble pas fonctionner, peu importe ce que je mets comme paramètre supplémentaire, il affichera tous les résultats contenant le mot que je recherche.

Dans mes types de publication, j'ai query_var défini sur true, donc en théorie, cela devrait fonctionner.

Ma boucle search.php ressemble à ceci

<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>

    <div class="post">

        <?php if ( 'post' == get_post_type() ) : ?>
        <p class="category"><?php the_category(' '); ?></p>
        <?php else : ?>
        <p class="category">Resource</p>
        <?php endif; ?>

        <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
        <?php the_excerpt(); ?> 

    </div><!-- /post -->

<?php endwhile; ?>

Utiliser une entrée cachée dans mon searchform.php ne fonctionne pas non plus,

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>"  class="search">
    <input type="text" class="field" name="s" id="s" />
    <input type="submit" class="submit" name="submit" value="Go" />
    <input type="hidden" name="post_type" value="myposttype" />
</form>

il recherche toujours les publications normales, pas seulement dans myposttype CPT.

Avez-vous une idée pourquoi les requêtes de recherche ne fonctionneraient pas? Toute aide appréciée.

1
Justine

J'ai constaté que le fait de passer post_type ne limitait pas les recherches à ce type, mais simplement ajoutait ce type au tableau qu'il cherchait déjà.

Ce que vous pouvez faire pour créer des requêtes de recherche complexes est un hook pre_get_posts et une petite manipulation de requête.

Pour un exemple simple, j’ajoute d’abord ma propre requête var à transmettre au tableau de vars de requêtes connues de WordPress:

function wpa53029_query_vars( $query_vars ){
    $query_vars[] = 'my_type';
    return $query_vars;
}
add_filter( 'query_vars', 'wpa53029_query_vars' );

Puis configurez le formulaire pour passer un type de message, comme:

mywebsite.com/?s=wordpress&my_type=page

mywebsite.com/?s=wordpress&my_type=page,mycustomtype

Ajoutez ensuite du code pour intercepter cette requête avant que la base de données ne soit interrogée, et définissez le type de publication:

function wpa53029_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_type'] ) ){
        $types = explode( ',', $query->query_vars['my_type'] );
        $query->set( 'post_type', $types );
    }

    return $query;
}
add_action( 'pre_get_posts', 'wpa53029_pre_get_posts' );

Pour le débogage, imprimez le contenu de l'objet de requête dans votre modèle search.php pour voir comment tout est défini et la requête SQL réelle générée par WordPress pour interroger la base de données. WordPress utilise $wp_query comme variable globale contenant la requête principale:

<pre>
    <?php print_r( $wp_query ); ?>
</pre>
0
Milo

Je n'ai pas testé cela, donc ça ne fonctionnera peut-être pas tout à fait comme je le pense, mais essayez ceci:

$post_type = $_GET['post_type'];

global $query_string
query_posts( $query_string . '&post_type=' . $post_type );

// loop here
0
Alex Lane