Ich habe ein Thema für ein Autohaus gebaut. Jedes Auto ist ein benutzerdefinierter Post-Typ ("Fahrzeug") und verfügt über etwa 12 benutzerdefinierte Felder mit Angaben wie Marke, Modell, Kilometerstand, Kraftstoffart usw. usw.
Grundsätzlich möchte ich auf der Startseite ein Suchformular, das Dropdown-Listen für Make & Model enthält und alle verfügbaren Makes oder Models enthält.
Ich möchte auch, dass es zwei Optionen für das Jahr gibt, sodass der Endbenutzer "2006" und "2012" auswählen kann und die Suchergebnisse alle Fahrzeuge mit dem Jahr zwischen diesen beiden Zahlen enthalten.
Gibt es da draußen ein Plugin, das das kann?
Vielen Dank für jede Hilfe .. das hat mich stundenlang verrückt gemacht !!!!
_____UPDATE______
Obwohl ich immer mehr Stimmen bekomme und die Lösung funktioniert, ist Cybmetas Antwort tatsächlich die Antwort, die Nice und WordPress 'Art ist. Das solltest du unbedingt probieren.
Erstellen Sie zunächst ein Formular für die erweiterte Suche, mit dem Ihr Benutzer mit der Website interagieren soll, und speichern Sie es unter einem Namen (dh ich habe es als advanced-searchform.php
gespeichert - aber speichern Sie es nicht mit searchform.php
, dann ersetzt es die Standardeinstellung von WordPress Suchformular):
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>
<!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
<input type="hidden" name="search" value="advanced">
<label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
<input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />
<label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
<select name="model" id="model">
<option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
<option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
<option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
</select>
<input type="submit" id="searchsubmit" value="Search" />
</form>
Rufen Sie dann das Formular wie folgt in Ihre Vorlage auf:
<?php get_template_part( 'advanced', 'searchform' ); ?>
Jetzt ist Ihr Suchformular fertig und Sie können das Suchformular verwenden und Benutzereingaben in die URL übernehmen.
Was Sie gerade brauchen, ist: fragen Sie die Datenbank ab und fragen Sie den Beitragstyp und seine benutzerdefinierten Felder ab gemäß der Suchabfrage. Denken Sie daran, dass Ihre Suchanfrage jetzt die URL ist, die Sie nach dem Absenden des Formulars erhalten haben. Bitten Sie nun WordPress, Ihre benutzerdefinierte Suchergebnisseite zu laden, wenn das Formular gesendet wird. Fügen Sie die folgende Funktion in Ihren functions.php
ein, damit Ihre benutzerdefinierte Suchvorlage anstelle des Standard-search.php
aktiviert wird:
<?php
function wpse_load_custom_search_template(){
if( isset($_REQUEST['search']) == 'advanced' ) {
require('advanced-search-result.php');
die();
}
}
add_action('init','wpse_load_custom_search_template');
?>
Ich habe den Code irgendwo von WPSE mitgebracht (ich habe die Wurzel vergessen), aber es gibt Kontroversen bei der Verwendung des obigen Codes. Aber es funktioniert tatsächlich (lahme Entschuldigung natürlich).
Überprüfen Sie auf andere Weise @ G.M. empfohlen.
Erstellen Sie eine neue Datei und speichern Sie sie mit advanced-search-result.php
(da wir diesen Namen in functions.php
verwendet haben). Jetzt sind Sie natürlich frei. Konzept ist:
WP_Query()
(wenn Ihre Abfrage komplex ist, verwenden Sie $wpdb
query),Eine Probe kann sein:
<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';
// Start the Query
$v_args = array(
'post_type' => 'vehicle', // your CPT
's' => $_name, // looks into everything with the keyword from your 'name field'
'meta_query' => array(
array(
'key' => 'car_model', // assumed your meta_key is 'car_model'
'value' => $_model,
'compare' => 'LIKE', // finds models that matches 'model' from the select field
),
)
);
$vehicleSearchQuery = new WP_Query( $v_args );
// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);
// Show the results
if( $vehicleSearchQuery->have_posts() ) :
while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
the_title(); // Assumed your cars' names are stored as a CPT post title
endwhile;
else :
_e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>
Also, hier ist deine letzte Sache. Dennoch gibt es viele Herausforderungen:
$wpdb
benutzerdefinierte SQL-Abfrage für komplexe Suchergebnisse verwenden und das wird reines MySQL sein - WordPress hat dort nichts.page.php
(oder search.php
) auswählen und diese Seite auf dieser Grundlage erstellen.Du hast also die Idee, jetzt bist du an der Reihe, den Weg zu erkunden und zu entdecken. Denken Sie daran, jeder ist anders. Mach deine, damit ich dir folgen kann. :)
Obwohl die Antwort von @ MayeenulIslam funktionieren könnte, denke ich, dass der richtige Weg für eine erweiterte Suche die Verwendung des Aktions-Hooks pre_get_posts
ist.
Schritt 1: Suchformular
Dieser Schritt entspricht Schritt 1 in der anderen Antwort und hat lediglich die ID des für die Suche verwendeten "Namens" in "s" geändert, sodass er direkt als Suchfeld verwendet wird. Speichern Sie diesen Code in searchform-advanced.php
in Ihrem Themenordner. Verwenden Sie dann get_template_part( 'advanced', 'searchform' );
, um es dort zu laden, wo es in Ihrem Design erscheinen soll:
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>
<!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
<input type="hidden" name="search" value="advanced">
<label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
<input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />
<label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
<select name="model" id="model">
<option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
<option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
<option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
</select>
<input type="submit" id="searchsubmit" value="Search" />
</form>
Schritt 2: Filter zur Suchanfrage hinzufügen
add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {
if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {
$query->set( 'post_type', 'vehicle' );
$_model = $_GET['model'] != '' ? $_GET['model'] : '';
$meta_query = array(
array(
'key' => 'car_model', // assumed your meta_key is 'car_model'
'value' => $_model,
'compare' => 'LIKE', // finds models that matches 'model' from the select field
)
)
);
$query->set( 'meta_query', $meta_query );
}
}
Schritt 3: Template erstellen (optional)
Bei dieser Methode wird die Standardsuchvorlage von WordPress verwendet, um die Ergebnisse zu filtern, ohne dass eine zweite Abfrage erforderlich ist. Wenn Sie eine andere Vorlage für die erweiterte Suche verwenden möchten, können Sie den Filter template_include
verwenden. Wenn Sie beispielsweise die Datei advanced-search-template.php
als Vorlage für die Ergebnisse der erweiterten Suche verwenden möchten, gehen Sie wie folgt vor:
add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
$t = locate_template('advanced-search-template.php');
if ( ! empty($t) ) {
$template = $t;
}
}
return $template;
}