SearchWP Documentation

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

Hinzuf\"ugen einer Kategorie-Auswahl-Dropdownbox zum Suchformular

Eine der beliebtesten Methoden zur Integration der Suche ist, Besuchern die Möglichkeit zu geben, den Ergebnispool selbst zu steuern. Dies geschieht normalerweise in Form einer Auswahl einer bestimmten Kategorie aus einer Dropdown-Liste (Select-Box), die zusammen mit der Suche verwendet wird.

Dieser Artikel erklärt, wie Sie drei verschiedene Ansätze zum Hinzufügen einer Kategorie-Dropdownliste zu Ihrem Suchformular umsetzen können.

  1. Erstellen Sie Ihr eigenes Suchformular mit einer Kategorien-Dropdownliste
  2. Passen Sie die Shortcode-Erweiterung an, um eine Kategorien-Dropdownliste einzuschließen
  3. Passen Sie das Standard-Suchformular an, um eine Kategorie-Auswahlliste hinzuzufügen

Erstellen Ihres eigenen Suchformulars

Das Erstellen Ihres eigenen Suchformulars beinhaltet die Bearbeitung Ihrer Theme-Dateien, um die Eingabefelder und Schaltflächen einzufügen, die wir einschließen möchten. Auf der grundlegendsten Ebene können Sie Folgendes zu Ihrer Theme-Vorlagendatei hinzufügen, wo immer das Formular erscheinen soll:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
<input type="search" class="search-field" placeholder="Search..." value="<?php echo esc_attr( get_search_query() ); ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ); ?>" />
</label>
<?php
// output all of our Categories
// for more information see http://codex.wordpress.org/Function_Reference/wp_dropdown_categories
$swp_cat_dropdown_args = array(
'show_option_all' => __( 'Any Category' ),
'name' => 'swp_category_limiter',
);
wp_dropdown_categories( $swp_cat_dropdown_args );
?>
<input type="submit" class="search-submit" value="Search" />
</form>
view raw sample.phtml hosted with ❤ by GitHub

Basierend auf dem von WordPress bereitgestellten Standard-Suchformular gibt dieses Formular ein Feld für die Suchanfrage, eine Select-Box mit all Ihren Kategorien und eine Schaltfläche zum Auslösen der Suche aus. Beachten Sie die an wp_dropdown_categories() übergebenen Argumente, die das 'Jede Kategorie'-Label definieren und den name der Dropdown-Liste als swp_category_limiter festlegen.

Nachdem Ihr Formular eingerichtet ist, müssen Sie SearchWP mitteilen, den übermittelten Wert der Dropdown-Liste bei der Suche zu berücksichtigen. Dazu verwenden wir ein Mod. Wir werden die in der Dropdown-Liste übermittelte Kategorie-ID verwenden, um unseren Ergebnispool auf die ausgewählte Kategorie zu beschränken.

Hinweis: Beachten Sie, dass die Variable, nach der wir suchen, diejenige war, die wir verwendet haben, um den name der select-Box festzulegen, die von wp_dropdown_categories() ausgegeben wurde.

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// Limit SearchWP results to chosen Category from dropdown.
// @link https://searchwp.com/documentation/knowledge-base/category-select-dropdown/
add_filter( 'searchwp\query\mods', function( $mods, $query ) {
global $wpdb;
// Only proceed if a Category was chosen from the dropdown.
if ( ! isset( $_GET['swp_category_limiter'] ) || empty( intval( $_GET['swp_category_limiter'] ) ) ) {
return $mods;
}
// Optional: only proceed if we're using a specific Engine.
// if ( 'default' !== $query->get_engine()->get_name() ) {
// return $mods;
// }
$alias = 'swpkbcat';
$tax_query = new WP_Tax_Query( [ [
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => absint( $_GET['swp_category_limiter'] ),
] ] );
$tq_sql = $tax_query->get_sql( $alias, 'ID' );
$mod = new \SearchWP\Mod();
// If the JOIN is empty, WP_Tax_Query assumes we have a JOIN with wp_posts, so let's make that.
if ( ! empty( $tq_sql['join'] ) ) {
// Queue the assumed wp_posts JOIN using our alias.
$mod->raw_join_sql( function( $runtime ) use ( $wpdb, $alias ) {
return "LEFT JOIN {$wpdb->posts} {$alias} ON {$alias}.ID = {$runtime->get_foreign_alias()}.id";
} );
// Queue the WP_Tax_Query JOIN which already has our alias.
$mod->raw_join_sql( $tq_sql['join'] );
// Queue the WP_Tax_Query WHERE which already has our alias.
$mod->raw_where_sql( '1=1 ' . $tq_sql['where'] );
} else {
// There's no JOIN here because WP_Tax_Query assumes a JOIN with wp_posts already
// exists. We need to rebuild the tax_query SQL to use a functioning alias. The Mod
// will ensure the JOIN, and we can use that Mod's alias to rebuild our tax_query.
$mod->set_local_table( $wpdb->posts );
$mod->on( 'ID', [ 'column' => 'id' ] );
$mod->raw_where_sql( function( $runtime ) use ( $tax_query ) {
$tq_sql = $tax_query->get_sql( $runtime->get_local_table_alias(), 'ID' );
return '1=1 ' . $tq_sql['where'];
} );
}
$mods[] = $mod;
return $mods;
}, 20, 2 );

Dieser Ausschnitt prüft, ob ein nicht leerer Wert aus der Dropdown-Liste ausgewählt wurde. Wenn ja, wird unser Mod erstellt und zur Query hinzugefügt.

Verwenden Sie die Shortcode-Erweiterung von SearchWP

Die Shortcode-Erweiterung von SearchWP ermöglicht es Ihnen, Suchformulare einfach auszugeben und Seiten mit Suchergebnissen mithilfe von WordPress-Shortcodes zu steuern. Hier ist ein Beispiel für ein Suchformular, das eine Dropdown-Liste für Kategorien zur Auswahl enthält:

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// UNCOMMENT THIS IF YOU WANT TO USE SHORTCODES IN WIDGETS
// add_filter( 'widget_text', 'do_shortcode' );
// output the categories dropdown
function my_searchwp_shortcodes_inject_categories() {
echo '<p class="searchwp-shortcodes-categories">';
// for more information see http://codex.wordpress.org/Function_Reference/wp_dropdown_categories
$swp_cat_dropdown_args = array(
'show_option_all' => __( 'Any Category' ),
'name' => 'swp_category_limiter',
);
wp_dropdown_categories( $swp_cat_dropdown_args );
echo '</p>';
}
add_action( 'searchwp_shortcodes_after_input', 'my_searchwp_shortcodes_inject_categories' );

Das kümmert sich um unser Suchformular. Es wird automatisch eine Dropdown-Liste unserer Kategorien zwischen dem Suchfeld und der Schaltfläche zum Absenden eingefügt. Beachten Sie, dass wir in diesem Ausschnitt den name der Dropdown-Liste auf swp_category_limiter angepasst haben, den wir als Nächstes verwenden werden.

Bisher haben wir nur das Formular so eingerichtet, dass es eine Dropdown-Liste ausgibt, mit der der Besucher eine Kategorie für die Einschränkung der Ergebnisse festlegen kann. Wir müssen diese Informationen immer noch erfassen, wenn das Formular übermittelt wird, und SearchWP darüber informieren.

Dazu verwenden wir ein Mod. Wir werden die in der Dropdown-Liste übermittelte Kategorie-ID verwenden, um unseren Ergebnispool auf die ausgewählte Kategorie zu beschränken.

Hinweis: Beachten Sie, dass die Variable, nach der wir suchen, diejenige war, die wir verwendet haben, um den name der select-Box festzulegen, die von wp_dropdown_categories() ausgegeben wurde.

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// Limit SearchWP results to chosen Category from dropdown.
// @link https://searchwp.com/documentation/knowledge-base/category-select-dropdown/
add_filter( 'searchwp\query\mods', function( $mods, $query ) {
global $wpdb;
// Only proceed if a Category was chosen from the dropdown.
if ( ! isset( $_GET['swp_category_limiter'] ) || empty( intval( $_GET['swp_category_limiter'] ) ) ) {
return $mods;
}
// Optional: only proceed if we're using a specific Engine.
// if ( 'default' !== $query->get_engine()->get_name() ) {
// return $mods;
// }
$alias = 'swpkbcat';
$tax_query = new WP_Tax_Query( [ [
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => absint( $_GET['swp_category_limiter'] ),
] ] );
$tq_sql = $tax_query->get_sql( $alias, 'ID' );
$mod = new \SearchWP\Mod();
// If the JOIN is empty, WP_Tax_Query assumes we have a JOIN with wp_posts, so let's make that.
if ( ! empty( $tq_sql['join'] ) ) {
// Queue the assumed wp_posts JOIN using our alias.
$mod->raw_join_sql( function( $runtime ) use ( $wpdb, $alias ) {
return "LEFT JOIN {$wpdb->posts} {$alias} ON {$alias}.ID = {$runtime->get_foreign_alias()}.id";
} );
// Queue the WP_Tax_Query JOIN which already has our alias.
$mod->raw_join_sql( $tq_sql['join'] );
// Queue the WP_Tax_Query WHERE which already has our alias.
$mod->raw_where_sql( '1=1 ' . $tq_sql['where'] );
} else {
// There's no JOIN here because WP_Tax_Query assumes a JOIN with wp_posts already
// exists. We need to rebuild the tax_query SQL to use a functioning alias. The Mod
// will ensure the JOIN, and we can use that Mod's alias to rebuild our tax_query.
$mod->set_local_table( $wpdb->posts );
$mod->on( 'ID', [ 'column' => 'id' ] );
$mod->raw_where_sql( function( $runtime ) use ( $tax_query ) {
$tq_sql = $tax_query->get_sql( $runtime->get_local_table_alias(), 'ID' );
return '1=1 ' . $tq_sql['where'];
} );
}
$mods[] = $mod;
return $mods;
}, 20, 2 );

Dieser Ausschnitt prüft, ob ein nicht leerer Wert aus der Dropdown-Liste ausgewählt wurde. Wenn ja, wird unser Mod erstellt und zur Query hinzugefügt.

Modifizieren Sie das Standard-Suchformular, um eine Kategorien-Dropdownliste einzuschließen

WordPress ermöglicht es uns, das Standard-Suchformular, das in vielen Themes zu finden ist, zu filtern. Es wird durch einen Aufruf von get_search_form() generiert, der entweder durch die Einbeziehung einer Datei namens searchform.php in Ihr Theme-Verzeichnis oder über den get_search_form-Filter vollständig angepasst werden kann. Für dieses Beispiel werden wir den get_search_form-Filter verwenden. Um diesen Filter zu verwenden, arbeiten Sie in der functions.php-Datei Ihres Themes.

Um eine Kategorien-Dropdownliste in das Standard-Suchformular Ihrer Website einzufügen, verwenden Sie den folgenden Ausschnitt:

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// adds a Categories dropdown to the search form
function my_searchwp_get_search_form_with_categories_dropdown( $form ) {
ob_start(); ?>
<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text">Search For</span>
<input type="search" class="search-field" placeholder="Search..." value="<?php echo esc_attr( get_search_query() ); ?>" name="s" title="Search for:" />
</label>
<?php
// for more information see http://codex.wordpress.org/Function_Reference/wp_dropdown_categories
$swp_cat_dropdown_args = array(
'show_option_all' => __( 'Any Category' ),
'name' => 'swp_category_limiter',
);
wp_dropdown_categories( $swp_cat_dropdown_args );
?>
<input type="submit" class="search-submit" value="Search" />
</form>
<?php return ob_get_clean();
}
add_filter( 'get_search_form', 'my_searchwp_get_search_form_with_categories_dropdown' );

Der hier verwendete Formularcode basiert auf dem Standard-Suchformular, das mit WordPress geliefert wird. Es besteht die Möglichkeit, dass Ihr Theme das Formular zuvor angepasst hat und Sie einfach die Dropdown-Liste hinzufügen möchten. Sie können den Formularcode einfach so anpassen, dass er mit dem Ihres Themes übereinstimmt, und die Zeilen 11-18 aus diesem Codebeispiel dort einfügen, wo Ihre Kategorien-Dropdownliste erscheinen soll.

Dieser Ausschnitt modifiziert nur das Suchformular. Wir müssen immer noch den Wert aus der Dropdown-Liste erfassen und SearchWP anweisen, die Ergebnisse auf eine bestimmte Kategorie zu beschränken.

Dazu verwenden wir ein Mod. Wir werden die in der Dropdown-Liste übermittelte Kategorie-ID verwenden, um unseren Ergebnispool auf die ausgewählte Kategorie zu beschränken.

Hinweis: Beachten Sie, dass die Variable, nach der wir suchen, diejenige war, die wir verwendet haben, um den name der select-Box festzulegen, die von wp_dropdown_categories() ausgegeben wurde.

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// Limit SearchWP results to chosen Category from dropdown.
// @link https://searchwp.com/documentation/knowledge-base/category-select-dropdown/
add_filter( 'searchwp\query\mods', function( $mods, $query ) {
global $wpdb;
// Only proceed if a Category was chosen from the dropdown.
if ( ! isset( $_GET['swp_category_limiter'] ) || empty( intval( $_GET['swp_category_limiter'] ) ) ) {
return $mods;
}
// Optional: only proceed if we're using a specific Engine.
// if ( 'default' !== $query->get_engine()->get_name() ) {
// return $mods;
// }
$alias = 'swpkbcat';
$tax_query = new WP_Tax_Query( [ [
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => absint( $_GET['swp_category_limiter'] ),
] ] );
$tq_sql = $tax_query->get_sql( $alias, 'ID' );
$mod = new \SearchWP\Mod();
// If the JOIN is empty, WP_Tax_Query assumes we have a JOIN with wp_posts, so let's make that.
if ( ! empty( $tq_sql['join'] ) ) {
// Queue the assumed wp_posts JOIN using our alias.
$mod->raw_join_sql( function( $runtime ) use ( $wpdb, $alias ) {
return "LEFT JOIN {$wpdb->posts} {$alias} ON {$alias}.ID = {$runtime->get_foreign_alias()}.id";
} );
// Queue the WP_Tax_Query JOIN which already has our alias.
$mod->raw_join_sql( $tq_sql['join'] );
// Queue the WP_Tax_Query WHERE which already has our alias.
$mod->raw_where_sql( '1=1 ' . $tq_sql['where'] );
} else {
// There's no JOIN here because WP_Tax_Query assumes a JOIN with wp_posts already
// exists. We need to rebuild the tax_query SQL to use a functioning alias. The Mod
// will ensure the JOIN, and we can use that Mod's alias to rebuild our tax_query.
$mod->set_local_table( $wpdb->posts );
$mod->on( 'ID', [ 'column' => 'id' ] );
$mod->raw_where_sql( function( $runtime ) use ( $tax_query ) {
$tq_sql = $tax_query->get_sql( $runtime->get_local_table_alias(), 'ID' );
return '1=1 ' . $tq_sql['where'];
} );
}
$mods[] = $mod;
return $mods;
}, 20, 2 );

Dieser Ausschnitt prüft, ob ein nicht leerer Wert aus der Dropdown-Liste ausgewählt wurde. Wenn ja, wird unser Mod erstellt und zur Query hinzugefügt.

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