Adăugare câmpuri personalizate la căutare
Vreau să adaug câmpuri personalizate ("introduction" și "ensavoirplus") la căutarea în Wordpress, dar codul SQL nu este exact. Nu înțeleg dacă fac o greșeală sau dacă WP nu poate face asta. Încercarea mea eșuează... Nu știu de ce deoarece fac exact ce spune codex-ul.
Acesta este codul meu:
function recherche_avancee( $query ) {
if ( !is_admin() && $query->is_search ) {
$custom_fields = array(
"introduction",
"en_savoir_plus_page"
);
$meta_query = array('relation' => 'OR');
foreach($custom_fields as $cf) {
array_push($meta_query, array(
'key' => $cf,
'value' => $_GET['s'],
'compare' => 'LIKE'
));
}
$query->set("meta_query", $meta_query);
}
}
add_action( 'pre_get_posts', 'recherche_avancee');
Și acesta este codul SQL:
1. SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
2. FROM wp_posts
3. INNER JOIN wp_postmeta
4. ON ( wp_posts.ID = wp_postmeta.post_id )
5. WHERE 1=1
6. AND (((wp_posts.post_title LIKE '%environnement%')
7. OR (wp_posts.post_content LIKE '%environnement%')))
8. AND wp_posts.post_type IN ('post', 'page', 'attachment')
9. AND (wp_posts.post_status = 'publish'
10. OR wp_posts.post_status = 'miseenavant'
11. OR wp_posts.post_author = 3
12. AND wp_posts.post_status = 'private')
13. AND ( ( wp_postmeta.meta_key = 'introduction'
14. AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%environnement%' )
15. OR ( wp_postmeta.meta_key = 'en_savoir_plus_page'
16. AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%environnement%' ) )
17. GROUP BY wp_posts.ID
18. ORDER BY wp_posts.menu_order ASC
19. LIMIT 0, 10
Erorile sunt la linia 13, deoarece nu vreau un AND ci un OR și liniile 13,14,15,16 ar trebui să meargă imediat după linia 7 pentru ca totul să funcționeze.
A mai avut cineva același tip de eroare și dacă da, de unde a provenit?
Mulțumesc

Datorită WordPress 4.1 poți face mai bine pentru meta_query: https://make.wordpress.org/core/2014/10/20/update-on-query-improvements-in-4-1/
function recherche_avancee($query) {
if (!is_admin() && $query->is_search) {
$meta_query = array(
'relation' => 'OR',
array(
'relation' => 'OR',
array(
'key' => 'introduction',
'value' => get_search_query(),
'compare' => 'LIKE',
),
array(
'key' => 'en_savoir_plus_page',
'value' => get_search_query(),
'compare' => 'LIKE',
),
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'recherche_avancee');
Nu am testat, dar înțelegeți ideea...

te rog să nu faci niciodată asta: 'value' => $_GET['s']
... $query->get('s');
, get_search_query, sau sanitize_key($_GET['s'])
sunt opțiuni mai sigure. Tehnic, nu ar trebui să folosim parametrii GET în WordPress deloc, nu este o practică recomandată. Valoarea GET ar putea fi tot felul de lucruri rele și nu vrem să o transmitem către baza de date fără a ne asigura că este curată.
De asemenea, folosești operatorul LIKE
... așa că poate ar fi bine să adaugi ghilimele în jurul valorii pentru o potrivire mai strictă.
'value' => '"'.$query->get('s').'"';

Am revizuit codul tău, dar nu reușesc să identific problema din codul tău. Am o soluție simplă. Poți folosi un plugin WordPress gratuit de la terți, WP Extended Search și să selectezi metacheile pe care dorești să le incluzi în rezultatele căutării. Acest plugin ajută la extinderea căutării implicite din WordPress și include metadatele articolelor, taxonomiile și tipurile personalizate de articole în rezultatele căutării.
WP Extended Search: https://wordpress.org/plugins/wp-extended-search/
Sper că acest lucru te ajută...!!
