______UPDATE_______
Chociaż otrzymuję coraz więcej głosów, a rozwiązanie działa, ale odpowiedź cybmeta jest w rzeczywistości odpowiedzią, która jest przyjemna i zgodna z WordPress. Zdecydowanie powinieneś tego spróbować.
Krok 1
Zacznij od utworzenia formularza wyszukiwania zaawansowanego, w którym chcesz, aby użytkownik wchodził w interakcję ze stroną internetową i zapisz go z nazwą (tj. Zapisałem go jako advanced-searchform.php
- ale nie zapisuj go, a searchform.php
wtedy zastąpi domyślny formularz wyszukiwania WordPressa ):
<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>
Następnie wywołaj formularz w szablonie w następujący sposób:
<?php get_template_part( 'advanced', 'searchform' ); ?>
Teraz twój formularz wyszukiwania jest gotowy i możesz teraz użyć formularza wyszukiwania i wprowadzić dane użytkownika do adresu URL.
Krok 2
Potrzebne jest tylko: zapytanie do bazy danych i zapytanie o typ postu i jego pola niestandardowe zgodnie z zapytaniem wyszukiwania . Pamiętaj, że zapytanie jest teraz adresem URL otrzymanym po przesłaniu formularza. Teraz poproś WordPress o załadowanie niestandardowej strony wyników wyszukiwania po przesłaniu formularza. Umieść następującą funkcję w swojej, functions.php
aby włączyć niestandardowy szablon wyszukiwania zamiast domyślnego 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');
?>
Przyniosłem kod gdzieś z WPSE (zapomniałem roota), ale użycie powyższego kodu budzi kontrowersje. Ale tak naprawdę działa ( kiepska wymówka oczywiście ).
Sprawdź inny sposób sugerowany przez @GM.
Krok 3
Utwórz nowy plik i zapisz go za pomocą advanced-search-result.php
(ponieważ używaliśmy tej nazwy w functions.php
), a teraz jesteś wolny - oczywiście. Koncepcja to:
- Chwyć dane z adresu URL,
- Użyj prostego
WP_Query()
(jeśli twoje zapytanie jest złożone, użyj $wpdb
zapytania),
- Przekaż polecenia w zapytaniu, pobierz dane z bazy danych i
- Pokaż wynik [s]
Próbka może być:
<?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();
?>
Oto twoja ostatnia rzecz. Ale wciąż istnieje wiele wyzwań:
- Alternatywne wartości - wyszukiwanie zaawansowane można wykonać dla WSZYSTKICH pól lub DOWOLNEGO pola, więc musisz upewnić się, że zapytanie przyjmuje wszystkie wyniki zgodnie z wyszukiwaniem i danymi. Możesz użyć
$wpdb
niestandardowego zapytania SQL dla złożonego wyniku wyszukiwania, który będzie czystym MySQL - WordPress nie ma tam nic.
- Sanitization & Validation - pole tekstowe i obszar tekstowy są tak wrażliwe, że mogą powodować niewłaściwe działanie witryny. Tak więc przekazywanie surowych danych byłoby niebezpieczne, musisz je zdezynfekować i zweryfikować przed przekazaniem do zapytania db. ( Czyszczenie i sprawdzanie poprawności danych za pomocą WordPress - TutsPlus )
- Projektowanie - możesz wybrać szablon
page.php
(lub search.php
) i na tej podstawie utworzyć tę stronę.
Masz pomysł, teraz twoja kolej na odkrycie i odkrycie drogi . Pamiętajcie, że każdy jest inny. Stwórz swój, abym mógł pójść za tobą. :)