SearchWP Documentation

Sehen Sie sich die Installationsanleitung an, durchsuchen Sie die Wissensdatenbank und erfahren Sie mehr über die vielen Hooks von SearchWP

Zusätzliche Engine

Inhaltsverzeichnis

SearchWP ermöglicht die Einrichtung beliebig vieler Engines, jede mit ihrer eigenen individuellen Konfiguration. Diese Segmentierung erleichtert multiple angepasste Suchimplementierungen auf Ihrer gesamten Website.

Die einzige Einschränkung der Standard-Engine ist, dass ihre Quellen auf WP_Post-Objekten basieren müssen. Das liegt daran, dass der WordPress-Kern davon ausgeht, dass Suchergebnisse in The Loop passen, und The Loop aus WP_Posts besteht. WP_Post-Objekte werden für Beiträge, Seiten, Medien und benutzerdefinierte Beitragstypen verwendet. Das deckt eine Menge ab!

SearchWP erleichtert auch die Suche nach benutzerdefinierten Quellen. Um dies vollständig zu nutzen, müssen Sie eine zusätzliche Engine einrichten und implementieren.

Einrichtung

Die Einrichtung einer zusätzlichen Engine folgt demselben Prozess wie die Standard- Engine, aber in diesem Fall stehen Ihnen alle Quellen zur Verfügung, nicht nur diejenigen, die auf WP_Post basieren.

Erstellen Sie eine neue zusätzliche Engine, indem Sie auf der Registerkarte „Engines“ im Einstellungsbildschirm von SearchWP auf die Schaltfläche „Neu hinzufügen“ klicken.

Screenshot, der auf die Schaltfläche "Neue Engine hinzufügen" zeigt

Fügen Sie eine zusätzliche Engine hinzu, indem Sie auf „Neu hinzufügen“ klicken

Sobald die neue Engine hinzugefügt wurde, können Sie die Quellen, Attribute und Regeln nach Ihren Wünschen anpassen.

Nachdem Sie Ihre Engine(s) gespeichert haben, prüft SearchWP, ob der Index neu erstellt werden muss, und gibt gegebenenfalls eine Benachrichtigung aus.

Der letzte Einrichtungsschritt besteht darin, den Namen der Engine zu notieren, der sich vom Label unterscheidet. Der Name befindet sich neben dem Label der Engine in einer nichtproportionalen Schriftart. Der Name ist, wie die Engine später im Code referenziert wird.

Formular

Das Einrichten eines Suchformulars für Ihre zusätzliche Engine beinhaltet die Erstellung eines <input> mit einem anderen Namen als s, da dieser Name eine native WordPress-Suche auslöst.

Etwas wie das hier funktioniert zunächst:

<form role="search" method="get" class="search-form"
action="<?php echo site_url( 'search-results/' ); ?>">
<label>
<span class="screen-reader-text">
<?php echo _x( 'Search for:', 'label' ) ?>
</span>
<input type="search" class="search-field"
name="searchwp"
placeholder="<?php echo esc_attr_x( 'Search...', 'placeholder' ) ?>"
value="<?php echo isset( $_GET['searchwp'] ) ? esc_attr( $_GET['searchwp'] ) : '' ?>"
title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
</label>
<input type="submit" class="search-submit"
value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

Es gibt zwei Dinge, die Sie an diesem Snippet beachten sollten:

  1. Der verwendete <input> Name ist searchwp
  2. Die form action verweist auf site_url( 'search-results/' ). Das bedeutet, wenn Ihre Website-URL example.com lautet, wird dieses Formular nach dem Absenden zu example.com/search-results/ weitergeleitet. Diese Anleitung geht davon aus, dass die URL auf eine von Ihnen erstellte Seite verweist, um zusätzliche Engine-Ergebnisse anzuzeigen.

Das ist alles! Dieses Startformular entspricht weitgehend der Standardausgabe von WordPress' get_search_form(), die wahrscheinlich von Ihrem Theme unterstützt wird. Wenn nicht, kann es wie jedes andere form auf Ihrer Website gestylt werden.

Ergebnisse

Wenn Sie Ihr Suchformular form erstellen, hat es eine action, die auf eine URL verweist, die als Seite für die Anzeige Ihrer Ergebnisse festgelegt ist. Um Ergebnisse von SearchWP abzurufen, erstellen wir zuerst eine benutzerdefinierte Seiten-Vorlage.

Hier ist eine Startvorlage, mit der wir arbeiten können:

<?php
/* Template Name: SearchWP Results */
global $post;
// Retrieve applicable query parameters.
$search_query = isset( $_GET['searchwp'] ) ? sanitize_text_field( $_GET['searchwp'] ) : null;
$search_page = isset( $_GET['swppg'] ) ? absint( $_GET['swppg'] ) : 1;
// Perform the search.
$search_results = [];
$search_pagination = '';
if ( ! empty( $search_query ) && class_exists( '\\SearchWP\\Query' ) ) {
$searchwp_query = new \SearchWP\Query( $search_query, [
'engine' => 'supplemental', // The Engine name.
'fields' => 'all', // Load proper native objects of each result.
'page' => $search_page,
] );
$search_results = $searchwp_query->get_results();
$search_pagination = paginate_links( array(
'format' => '?swppg=%#%',
'current' => $search_page,
'total' => $searchwp_query->max_num_pages,
) );
}
get_header(); ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<header class="page-header">
<h1 class="page-title">
<?php if ( ! empty( $search_query ) ) : ?>
<?php printf( __( 'Search Results for: %s' ), esc_html( $search_query ) ); ?>
<?php else : ?>
SearchWP Supplemental Search
<?php endif; ?>
</h1>
<!-- BEGIN Supplemental Engine Search form -->
<form role="search" method="get" class="search-form"
action="<?php echo site_url( 'search-results/' ); ?>">
<label>
<span class="screen-reader-text">
<?php echo _x( 'Search for:', 'label' ) ?>
</span>
<input type="search" class="search-field"
name="searchwp"
placeholder="<?php echo esc_attr_x( 'Search...', 'placeholder' ) ?>"
value="<?php echo isset( $_GET['searchwp'] ) ? esc_attr( $_GET['searchwp'] ) : '' ?>"
title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
</label>
<input type="submit" class="search-submit"
value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>
<!-- END Supplemental Engine Search form -->
</header>
<?php if ( ! empty( $search_query ) && ! empty( $search_results ) ) : ?>
<?php foreach ( $search_results as $search_result ) : ?>
<article class="page hentry search-result">
<?php
switch( get_class( $search_result ) ) {
case 'WP_Post':
$post = $search_result;
?>
<header class="entry-header"><h2 class="entry-title">
<a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a>
</h2></header>
<div class="entry-summary"><?php the_excerpt(); ?></div>
<?php
wp_reset_postdata();
break;
case 'WP_User':
?>
<header class="entry-header"><h2 class="entry-title">
<a href="<?php echo get_author_posts_url( $search_result->data->ID ); ?>">
<?php echo esc_html( $search_result->data->display_name ); ?>
</a>
</h2></header>
<div class="entry-summary">
<?php echo wp_kses_post( get_the_author_meta( 'description',
$search_result->data->ID ) ); ?>
</div>
<?php
break;
case 'WP_Term':
?>
<header class="entry-header">
<h2 class="entry-title">
<a href="<?php echo get_term_link( $search_result->term_id, $search_result->taxonomy ); ?>">
<?php echo esc_html( $search_result->name ); ?>
</a>
</h2>
<div class="entry-summary">
<?php echo esc_html( $search_result->description ); ?>
</div>
</header>
<?php
break;
}
?>
</article>
<?php endforeach; ?>
<?php if ( $searchwp_query->max_num_pages > 1 ) : ?>
<div class="navigation pagination" role="navigation">
<h2 class="screen-reader-text">Results navigation</h2>
<div class="nav-links"><?php echo wp_kses_post( $search_pagination ); ?></div>
</div>
<?php endif; ?>
<?php elseif ( ! empty( $search_query ) ) : ?>
<p>No results found, please search again.</p>
<?php endif; ?>
</main> <!-- .site-main -->
</div> <!-- .content-area -->
<?php get_footer(); ?>

Lassen Sie uns diese Startervorlage in vier Abschnitte unterteilen:

  1. Ausführen der Suche
  2. Ausgabe des Suchformulars (erneut)
  3. Anzeigen der Ergebnisse
  4. Anzeigen der Paginierung

Die Zeilen 7-28 sind für den Abruf der Suchanfrage, die Ausführung der Suche und die Füllung unseres Ergebnis-Arrays verantwortlich.

Die Zeilen 44-60 geben das von uns oben erstellte Suchformular aus.

Die Zeilen 64-94 sind für die Ausgabe unserer Suchergebnisse verantwortlich.

Beachten Sie, dass wir in Zeile 15 \SearchWP\Query angewiesen haben, 'all' abzurufen, was sicherstellt, dass die Ergebnisse als ihr ursprünglicher Objekttyp (z. B. WP_Post) zurückgegeben werden, wie im \SearchWP\Source festgelegt.

Hinweis: Standardmäßig gibt \SearchWP\Query ein Objekt zurück, das die id, source, site und relevance für jedes Ergebnis enthält. Das Setzen des fields-Arguments auf 'all' weist \SearchWP\Query an, dieses Ergebnis durch ein natives Objekt aus der Quelle selbst zu ersetzen. Alternativ gibt das Setzen des fields-Arguments auf 'entries' ein Array von \SearchWP\Entry-Objekten zurück.

Das bedeutet, dass Beiträge, Seiten, benutzerdefinierte Beitragstypen und Medien als ihre ursprünglichen WP_Post-Objekte zurückgegeben werden. Benutzer werden als WP_User-Objekte zurückgegeben. Zusätzliche Quellen geben ebenfalls ihr natives Objekt zurück.

Im Gegensatz zur Arbeit mit The Loop müssen wir bei der Arbeit mit einer ergänzenden Engine bestimmen, von welchem Typ das Ergebnis ist, bevor wir Daten ausgeben.

In diesem Beispiel verwenden wir eine switch-Anweisung, die sich gut eignet, da diese Demo-Engine nur Beiträge, Seiten und Benutzer als Quellen enthält.

Hinweis: Wenn Sie stattdessen nur die minimale Datenmenge für Suchergebnisse wünschen, können Sie das fields-Argument vollständig weglassen. Sie müssen dann die Objekt-Eigenschaften des Ergebnisses verwenden, um die für die Anzeige Ihrer Ergebnisse erforderlichen Daten abzurufen.

Erstellen Sie noch heute eine bessere WordPress-Sucherfahrung

Verlieren Sie nie wieder Besucher an unzureichende Suchergebnisse. SearchWP macht die Erstellung Ihrer eigenen intelligenten WordPress-Suche schnell und einfach.

Get SearchWP Now
Symbol für mehrere Suchmaschinen