it-swarm.com.de

Suchergebnisse auf derselben Seite anzeigen

Problem

Ich habe eine Seite auf meiner Website, auf der ich zusätzliche Suchvorgänge durchführen muss. Ich verwende die Standardmethode der WordPress-Suche mit <?php get_search_form(); ?> für meine Hauptsuche in den Kopfzeilen, was sehr gut funktioniert.

Ich habe ein anderes HTML-Formular auf meiner Seite erstellt und nicht die Standardmethode PHP für die zusätzliche Suche wie folgt verwendet:

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

Ich verwende den type=hidden, um den benutzerdefinierten Beitragstyp zu erhalten, den ich durchsuchen möchte:

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

das gibt mir einen Link, der aussieht wie:

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

Frage

Wenn ich das auf der Seite erstellte neue Suchformular verwende, wird die Standard-search.php verwendet, um die Ergebnisse anzuzeigen. Wie kann ich die Suchergebnisse der benutzerdefinierten Beitragstypsuche anzeigen, beispielsweise in einer div auf derselben Seite?

Ich habe versucht, eine neue Seitenvorlage zu erstellen, die die Ergebnisse ohne Erfolg anzeigt. Ist dies der richtige Weg und ich habe es einfach falsch gemacht?

* Bearbeiten *

Ich versuche die Lösung von sanchothefat. Sieht das richtig aus? Dies ist mein ganzer Bereich für meine Suchergebnisse und Suchanfragen.

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

Ich erhalte die Fehlermeldung 404, die beim Durchlaufen der Suche nicht gefunden wurde.

7
Romes

Die einfachste Option, wenn Sie Suchergebnisse in einem Seitenkontext anzeigen möchten, ist eine benutzerdefinierte Schleife. Andernfalls können Sie nicht auf die Seiteninformationen zugreifen.

Ändern Sie die Eingabe mit dem Namen s in etwas anderes wie search oder q, um zu verhindern, dass WordPress die übliche integrierte Suche ausführt.

Ändern Sie als Nächstes den Parameter form action in die URL der aktuellen Seite. Sie können dafür <?php get_permalink(); ?> verwenden.

Die Schleife, die Sie ausführen müssen, lautet wie folgt:

<?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

Sie können die Abfrage ändern, bevor sie verarbeitet wird:

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

});

Dadurch erhalten Sie Beiträge, die dem angeforderten Beitragstyp entsprechen.

Wenn Sie mehrere Beitragstypen abfragen möchten, übergeben Sie stattdessen einfach ein Array: array('post', 'page', $post_type). Wenn Sie Posts nach Typ gruppieren möchten, überprüfen Sie den Typ in der Schleife und speichern Sie Ihre CPTs in einem temporären Array, das Sie durchlaufen, nachdem die normalen Posts angezeigt wurden.

2
onetrickpony