Ce fac funcțiile add_filters() și apply_filter() în WordPress?
Sunt puțin confuz de ce nu funcționează - deși trebuie să menționez că nu sunt sigur ce fac exact apply_filters()
și add_filter
, așa că orice sfat general ar fi grozav!
Vreau o interogare care să aducă cele cinci postări anterioare pe o pagină cu un singur post. Trimt data postului curent și vreau să aplic un filtru care să excludă postările mai vechi decât aceasta.
function sw_filter_posts_before( $where = '', $date) {
$where .= " AND post_date < '" . $date . "'";
return $where;
}
Cum pot aplica corect acest lucru? Simpla utilizare a add_filter sau apply_filter înainte de a instantia un nou obiect WP_Query nu pare să funcționeze corect.
Mulțumesc anticipat!
Edit: Pentru a intra mai în detaliu, aș dori să înțeleg cum să transmit o variabilă în filtru, deoarece nu reușesc să transmit $date dintr-o altă funcție.
Iată funcția respectivă (este un apel AJAX în WordPress, de aceea încep prin a obține ID-ul postului pentru pagina curentă printr-o variabilă $_POST):
function create_more_videos_sidebar() {
$id = $_POST['theID'];
$args = array( 'post_type' => 'videos',
'posts_per_page' => 1,
'p' => $id
);
$wp_query = new WP_Query($args);
while ($wp_query->have_posts()) : $wp_query->the_post(); $do_not_duplicate = $post->ID;
$date = get_the_date('Y-m-d');
endwhile;
$args = array( 'post_type' => 'videos',
'posts_per_page' => 5
);
add_filter( 'posts_where', 'sw_filter_videos_before' ); //nu știu cum să transmit $date
$wp_query = new WP_Query($args);
remove_filter( 'posts_where', 'sw_filter_videos_before' );
//aici se află logica buclei
$response = json_encode( array( 'result' => $result ) );
header( "Content-Type: application/json" );
echo $response;
exit;
}

Ce încerci să filtrezi? Presupun că încerci să adaugi un filtru la un hook de filtrare numit posts_before
. În acest caz, trebuie să adaugi filtrul tău la acest hook, folosind add_filter()
:
function mytheme_filter_posts_before( $where = '', $date) {
$where .= " AND post_date < '" . $date . "'";
return $where;
}
// Adaugă funcția la hook-ul de filtrare
add_filter( 'posts_before', 'mytheme_filter_posts_before' );
Observă că am schimbat numele funcției tale. filter_posts_before()
este un nume de funcție prea generic și foarte probabil să provoace o coliziune de nume.
EDITARE
Și doar pentru a clarifica:
apply_filters()
este locația hook-ului de filtrare, este apelat de codul de bază și este folosit pentru a aplica orice filtre care sunt adăugate la coadă de către Temă/Plugin-uri (și codul de bază).add_filter()
este apelat de Temă/Plugin-uri (și codul de bază) și este folosit pentru a adăuga filtre la coadă care să fie aplicate la hook de către codul de bază.
EDITARE 2
Bazat pe comentariul tău de mai sus, hook-ul este posts_where
. Deci, hai să încercăm să reconstruim funcția ta de callback:
function mytheme_filter_posts_where( $where ) {
// Aici, trebuie să ne dăm seama cum
// să determinăm ce dată să folosim. În exemplul tău,
// apelezi get_the_date(),
// dar această funcție trebuie folosită în interiorul
// Loop-ului. Să încercăm get_the_time()
// în schimb. Va trebui doar să găsești
// o modalitate de a determina ce ID de post să folosești.
$post = 'some_post_id';
$date = get_the_time( 'Y-m-d', $post );
$where .= " AND post_date < '" . $date . "'";
return $where;
}
// Adaugă funcția la hook-ul de filtrare
add_filter( 'posts_where', 'mytheme_filter_posts_where' );

Mulțumesc pentru clarificare! Mă voi asigura că redenumesc filtrul. Totuși, încă nu înțeleg cum să transmit variabila $date către acesta, poți să clarifici și asta, te rog? Mulțumesc!

$date provine de la o altă funcție a mea, reprezintă data postării curente, în formatul 'Y-m-d'.

Globalizezi variabila $date
sau o returnezi din funcție, sau ce? Poți să postezi și codul acelei funcții?

Bine, am actualizat postarea originală cu câteva detalii suplimentare. Aș putea globaliza data, dar este cu totul necesar? Nu este mai bine, dacă este posibil, să o transmitem cumva?

Am actualizat răspunsul meu. Trebuie doar să găsim o metodă pentru a determina ID-ul postării la care să ne referim pentru a obține data corectă de utilizat în interogare.

Absolut. Am urmat sfatul tău inițial și am obținut ID-ul postării de pe pagină prin json, apoi l-am globalizat. Funcționează bine, dar presupun că nu este cea mai bună practică? Totul funcționează perfect acum, dar m-aș simți mult mai bine dacă aș putea transmite aceste date în mod privat. Mulțumesc foarte mult pentru ajutorul tău până acum.
