it-swarm.com.de

Erstellen eines Suchformulars für benutzerdefinierte Felder

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

11
absdigital

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

Schritt 1

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.

Schritt 2

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.

Schritt 3

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:

  • Nimm die Daten von der URL,
  • Verwenden Sie eine einfache WP_Query() (wenn Ihre Abfrage komplex ist, verwenden Sie $wpdb query),
  • Übergeben Sie die Befehle in der Abfrage, holen Sie die Daten von db und
  • Zeige das Ergebnis

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:

  • Alternative Werte - Eine erweiterte Suche kann mitALLder Felder oderANYdes Feldes durchgeführt werden, daher müssen Sie die Abfrage überprüfen nimmt alle Ergebnisse gemäß der Suche und Daten. Sie können $wpdb benutzerdefinierte SQL-Abfrage für komplexe Suchergebnisse verwenden und das wird reines MySQL sein - WordPress hat dort nichts.
  • Desinfektion & Validierung - Das Textfeld und der Textbereich sind so anfällig, dass Ihre Website möglicherweise nicht ordnungsgemäß funktioniert. Damit die Weitergabe von Rohdaten nicht sicher ist, müssen Sie sie bereinigen und validieren, bevor Sie sie an die Datenbankabfrage übergeben. ( Datenbereinigung und Validierung mit WordPress - TutsPlus )
  • Entwerfen - Sie können die Vorlage 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. :)

15
Mayeenul Islam

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;
}
18
cybmeta