Suchergebnisse auf derselben Seite anzeigen


7

Problem

Ich habe eine Seite auf meiner Website, auf der ich zusätzliche Suchen auf dieser Seite durchführen muss. Ich verwende die Standardmethode der WordPress-Suche <?php get_search_form(); ?>für meine Haupt-Header-Suche, was großartig funktioniert.

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

<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 die 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 ähnlich aussieht wie:

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

Frage

Wenn ich das neue Suchformular verwende, das auf der Seite erstellt wurde, wird die Standardeinstellung search.php verwendet, um die Ergebnisse anzuzeigen. Wie kann ich die Suchergebnisse der Suche nach benutzerdefinierten Beitragstypen anzeigen, z. B. divauf derselben Seite?

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

* Bearbeiten *

Ich versuche die Lösung von Sanchothefat. Sieht das richtig aus? Dies ist mein ganzes Div 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 404-Fehlerseite, die beim Durchlaufen der Suche nicht gefunden wurde.


Hat meine Lösung am Ende für Sie funktioniert?
Sanchothefat

Sie haben mich in die richtige Richtung gelenkt, also hat es mir in gewisser Weise geholfen. Vielen Dank.
Romes

1
Was war deine Lösung? Ich versuche das Gleiche zu tun - zeige die Suchergebnisse eines benutzerdefinierten Beitrags auf derselben Seite wie die Suchanfrage an und erhalte immer wieder eine 404-Seite, wenn ich auf Senden klicke
Claire

Antworten:


4

Die einfachste Option, wenn Sie Suchergebnisse in einem Seitenkontext anzeigen möchten, müssen Sie eine benutzerdefinierte Schleife ausführen, da Sie sonst nicht auf die Seiteninformationen zugreifen können.

Ändern Sie die Eingabe mit dem Namen sin etwas anderes wie searchoder um qzu verhindern, dass WordPress die übliche integrierte Suche ausführt.

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

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();
    }
?>

Ich muss wechseln if ( have_posts() ) : while ( have_posts() ) :, if ( have_posts() ) : while ( have_posts() ) : the_post();um eine Endlosschleife zu vermeiden (nicht sicher warum). Vielleicht, weil ich eine benutzerdefinierte Vorlage mit rendere get_template_part(...).
Jmarceli

2

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). Um Beiträge nach Typ zu gruppieren, überprüfen Sie den Typ in der Schleife und speichern Sie Ihre CPTs in einem temporären Array, das Sie iterieren, nachdem die normalen Beiträge angezeigt wurden.


Ist das etwas, was ich in meine Datei functions.php oder einfach direkt auf der Seite eingefügt habe?
Romes

Ja, entweder das oder ein neues Plugin erstellen und den Code
einfügen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.