Ce fac funcțiile add_filters() și apply_filter() în WordPress?

23 aug. 2011, 15:18:25
Vizualizări: 18.7K
Voturi: 5

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;
}
3
Comentarii

Bine, să începem cu primul lucru: la ce hook anume încerci să adaugi filtrul tău? Asta contează, pentru că variabila ta $date folosește date din $post, deci trebuie să știm dacă filtrăm în interiorul sau în afara Loop-ului.

Chip Bennett Chip Bennett
23 aug. 2011 17:31:31

Cred că aici mă lovește lipsa mea de cunoștințe despre filtrele din WordPress. Am crezut că hook-ul este 'posts_where' și că va adăuga șirul dat în interogarea SQL. Din câte știu, asta e în afara loop-ului, fiind în partea de preprocesare a creării unui loop. Ai vreo sugestie despre cum aș putea atinge scopul meu folosind cele mai bune practici?

Michael Watson Michael Watson
23 aug. 2011 19:27:38

Desigur, putem ajunge acolo. :) Ce dată vrei să folosești? Mai precis: cum vrei să determini ce dată să folosești?

Chip Bennett Chip Bennett
23 aug. 2011 20:53:28
Toate răspunsurile la întrebare 1
7

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' );
23 aug. 2011 15:26:20
Comentarii

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!

Michael Watson Michael Watson
23 aug. 2011 15:34:12

Ce este variabila $date și de unde provine?

Chip Bennett Chip Bennett
23 aug. 2011 15:38:27

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

Michael Watson Michael Watson
23 aug. 2011 15:49:57

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

Chip Bennett Chip Bennett
23 aug. 2011 16:31:33

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?

Michael Watson Michael Watson
23 aug. 2011 16:42:11

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.

Chip Bennett Chip Bennett
23 aug. 2011 20:58:51

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.

Michael Watson Michael Watson
24 aug. 2011 13:16:09
Arată celelalte 2 comentarii