web-dev-qa-db-fra.com

Afficher les résultats de la recherche dans la même page

Problème

J'ai une page sur mon site où je dois faire des recherches supplémentaires dans cette page. J'utilise la méthode par défaut de recherche dans WordPress avec <?php get_search_form(); ?> pour la recherche de mon en-tête principal, ce qui fonctionne très bien.

J'ai créé un autre formulaire HTML sur ma page, n'utilisant pas la méthode par défaut PHP, pour la recherche supplémentaire comme suit:

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
    <div>
        <label for="s" class="screen-reader-text">Search for:</label>
        <input type="text" id="s" name="s" value="" />
        <input type="hidden" name="post_type" value="photo_group" /> 
        <input type="submit" value="Search" id="searchsubmit" />
    </div>
</form>

J'utilise le type=hidden pour obtenir le type de publication personnalisé dans lequel je souhaite effectuer une recherche:

<input type="hidden" name="post_type" value="photo_group" />

ce qui me donne un lien qui ressemble à:

http://mywebsite.com/?s=search&post_type=photo_group

Question

Lorsque j'utilise le nouveau formulaire de recherche créé sur la page, il utilise le fichier search.php par défaut pour afficher les résultats. Comment puis-je afficher les résultats de la recherche de type publication personnalisée, disons dans une variable div sur la même page?

J'ai essayé de créer un nouveau modèle de page qui afficherait les résultats sans succès. S'agit-il de la bonne façon de le faire et je me suis tout simplement trompé?

* Modifier *

J'essaie la solution de sanchothefat. Est-ce que ça a l'air correct? Ceci est tout mon div pour mes résultats de recherche et requête de recherche.

<div id="photo-search">
    <h2>Search Photos:</h2>
    <form action="<?php the_permalink(); ?>" id="searchform" method="get">
        <div>
            <label for="s" class="screen-reader-text">Search for:</label>
            <input type="text" id="search" name="search" value="" />
            <input type="hidden" name="post_type" value="photo_group" /> 
            <input type="submit" value="Search" id="searchsubmit" />
        </div>
    </form>

    <?php if( isset( $_REQUEST['search'] ) ) {
        query_posts( array(
        's' => $_REQUEST['search'],
        'post_type' => $_REQUEST['photo_group'],
        'paged' => $paged
        ));

        if( have_posts() ) : while ( have_posts() ) :
            the_title();
            the_content();                      
        endwhile; endif;

        wp_reset_query(); 
        }
    ?>
</div>

Je reçois une page d'erreur 404 non trouvée lors de l'exécution de la recherche.

7
Romes

L'option la plus simple si vous souhaitez afficher les résultats de la recherche dans un contexte de page doit faire une boucle personnalisée, sinon vous ne pourrez pas accéder aux informations de la page.

Modifiez l'entrée avec le nom s en quelque chose comme search ou q pour empêcher WordPress de faire la recherche habituelle.

Ensuite, modifiez le paramètre formulaire action en l'URL de la page en cours. Vous pouvez utiliser <?php get_permalink(); ?> pour cela.

La boucle que vous devez faire est la suivante:

<?php
    if ( isset( $_REQUEST[ 'search' ] ) ) {
          // run search query
          query_posts( array(
             's' => $_REQUEST[ 'search' ],
             'post_type' => $_REQUEST[ 'post_type' ],
             'paged' => $paged
             )
          );

        // loop
        if ( have_posts() ) : while ( have_posts() ) :
            // loop through results here
        endwhile; endif;

        // return to original query
        wp_reset_query();
    }
?>
4
sanchothefat

Vous pouvez modifier la requête avant qu'elle ne soit traitée:

add_action('parse_query', function($query){

  // not the search request
  if(!$query->is_search)
    return;

  // validate post type here (you should provide a white-list)
  $post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;

  // adjust the query
  if($post_type && post_type_exists($post_type))
    $query->set('post_type', $post_type);

});

Cela vous permettra d'obtenir des messages correspondant au type de message demandé.

Si vous souhaitez interroger plusieurs types de publication, passez simplement un tableau à la place: array('post', 'page', $post_type). Et pour regrouper les publications en fonction du type, vérifiez le type dans la boucle et stockez vos CPT dans un tableau temporaire, que vous parcourez une fois que les publications normales ont été affichées.

2
onetrickpony