Erstellen eines Suchformulars für benutzerdefinierte Felder

11

Ich habe ein Thema für ein Autohaus erstellt. Jedes Auto ist ein benutzerdefinierter Pfostentyp ("Fahrzeug") und verfügt über ca. 12 benutzerdefinierte Felder mit Angaben zu Marke, Modell, Kilometerstand, Kraftstofftyp usw. usw.

Grundsätzlich möchte ich auf der Homepage ein Suchformular, das Dropdown-Listen für Make & Model enthält und alle verfügbaren Marken oder Modelle 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 !!!!

absdigital
quelle
Ich denke, Sie können dieses Plug-In verwenden, um besser zu werden wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI
Danke. Aber das erklärt nicht, wie man das Suchformular tatsächlich erstellt. Ich meine, ich kann das Formular in HTML programmieren, aber wie kann ich es tatsächlich zum Laufen bringen?!
Absdigital

Antworten:

16

______UPDATE_______
Obwohl ich immer mehr Stimmen bekomme und die Lösung funktioniert, ist die Antwort von Cybmeta tatsächlich die Antwort, die nett und WordPress- artig 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 gespeichert advanced-searchform.php- aber speichern Sie searchform.phpes nicht mit, da es das Standardsuchformular von WordPress ersetzt ):

<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

Sie benötigen lediglich Folgendes: Fragen Sie die Datenbank ab und fragen Sie den Beitragstyp und seine benutzerdefinierten Felder gemäß der Suchabfrage ab . 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 Ihre ein functions.php, damit Ihre benutzerdefinierte Suchvorlage anstelle der Standardfunktion aktiviert wird search.php:

<?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 einen anderen Weg, den @GM vorgeschlagen hat.

Schritt 3

Erstellen Sie eine neue Datei und speichern Sie sie mit advanced-search-result.php(weil wir diesen Namen verwendet haben functions.php), und jetzt sind Sie frei - offensichtlich. Konzept ist:

  • Holen Sie sich die Daten von der URL,
  • Verwenden Sie eine einfache WP_Query()(wenn Ihre Abfrage komplex ist, verwenden Sie die $wpdbAbfrage),
  • Übergeben Sie die Befehle innerhalb der Abfrage, rufen Sie Daten aus der Datenbank ab und
  • Ergebnis anzeigen [s]

Ein Beispiel 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. Trotzdem gibt es viele Herausforderungen:

  • Alternative Werte - Eine erweiterte Suche kann mit ALLEN Feldern oder JEDEM Feld durchgeführt werden. Sie müssen also sicherstellen, dass die Abfrage alle Ergebnisse gemäß Suche und Daten erfasst. Sie können eine $wpdbbenutzerdefinierte SQL-Abfrage für komplexe Suchergebnisse verwenden, und das ist reines MySQL - WordPress hat dort nichts.
  • Desinfektion und Validierung - Das Textfeld und der Textbereich sind so anfällig, dass es zu Fehlpraktiken auf Ihrer Website kommen kann. Die Übergabe von Rohdaten wäre daher unsicher. Sie müssen sie bereinigen und validieren, bevor Sie sie an die Datenbankabfrage übergeben. ( Datenbereinigung und -validierung mit WordPress - TutsPlus )
  • Entwerfen - Sie können die page.php(oder search.php) Vorlage auswählen und diese Seite auf dieser Grundlage erstellen.

Sie haben die Idee, jetzt sind Sie an der Reihe, den Weg zu erkunden und zu entdecken . Denken Sie daran, jeder Weg ist anders. Mach deins, damit ich dir folgen kann. :) :)

Mayeenul Islam
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, sehr nett von Ihnen. Wissen Sie, wie ich es haben kann, damit im Dropdown-Menü für "Marken" automatisch alle Marken angezeigt werden, die in einem der Fahrzeugpfosten eingegeben wurden?
Absdigital
Werde mich freuen, wenn es bei dir funktioniert. :)
Mayeenul Islam
Wissen Sie, wie ich es haben kann, damit im Dropdown-Menü für "Marken" automatisch alle Marken angezeigt werden, die in einem der Fahrzeugpfosten eingegeben wurden?
Absdigital
Verwenden Sie ein WP_Query()benutzerdefiniertes Feld und verwenden Sie eine Schleife, um das Ergebnis <option>anzuzeigen.
Mayeenul Islam
Ich würde gerne sehen, dass diese "erweiterte Suche" mit pre_get_postsHook und nicht mit einer sekundären Schleife durchgeführt wird.
Cybmeta
23

Obwohl die Antwort von @ MayeenulIslam funktionieren könnte, denke ich, dass der richtige Weg, eine erweiterte Suche durchzuführen, die Verwendung des pre_get_postsAktions-Hooks ist.

Schritt 1: Suchformular

Dieser Schritt entspricht Schritt 1 in der anderen Antwort. Er hat nur iddas nameFeld geändert ( <input type="text" ...>für die Suche in "s" verwendet , sodass es direkt als Suchfeld verwendet wird. Speichern Sie diesen Code in advanced-searchform.phpIhrem Themenordner. Verwenden Sie dann get_template_part( 'advanced', 'searchform' );bis Laden Sie es dort, wo es in Ihrem Thema erscheinen soll:

<?php /**`advanced-searchform.php`*/ ?>
<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: Fügen Sie der Suchabfrage Filter hinzu

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: Vorlagen (optional)

Bei dieser Methode wird die Standardsuchvorlage von WordPress verwendet, um die Ergebnisse zu filtern, ohne dass eine sekundäre Abfrage erforderlich ist. Wenn Sie eine andere Vorlage für die erweiterte Suche verwenden möchten, können Sie den template_includeFilter verwenden. Wenn Sie beispielsweise eine advanced-search-template.phpDatei als Vorlage für Ergebnisse aus dem erweiterten Suchformular verwenden möchten :

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;
}
Cybmeta
quelle
3
Vielen Dank für den Weg von WordPress. Ich habe gerade mit diesem gearbeitet und es ist großartig. :)
Mayeenul Islam