Różnica między add_filter i Apply_filters

17

Szukałem odpowiedniego wyjaśnienia różnicy między add_filter()i apply_filters()tutaj, ale nie mogłem znaleźć.

Czy ktoś może mi powiedzieć, jakie informacje lub logikę wziąć pod uwagę przed użyciem add_filterlub apply_filtersw jednym kontekście.

Czyli korzystanie z jednego imperatywu, a nie drugiego?

  • Czy to prawda, że add_filterpo prostu dodaje funkcję do kolejki funkcji oczekujących na wykonanie na zmiennej i apply_filterswykonuje funkcje w kolejności?

  • Czy prawdą jest również to, że apply_filterswywołany argumentem (nazwą funkcji do uruchomienia) wykona tę funkcję przed wszystkimi innymi (jeśli istnieją) w kolejce?

Hanachi
źródło
2
Co z istniejącą dokumentacją tutaj i tutaj nie wyjaśnia jej odpowiednio dla ciebie?
t31os
3
Myślę, że to dobre pytanie. Jako nowy program wordpress może to być mylące pojęcie.
Shawn

Odpowiedzi:

26

Większość następujących elementów można znaleźć w Kodeksie :


apply_filters

Funkcje zwrotne dołączone do haka filtru $tagsą wywoływane przez wywołanie tej funkcji. Tej funkcji można użyć do utworzenia nowego haka filtru, po prostu wywołując tę ​​funkcję z nazwą nowego haka określoną za pomocą parametru $ tag.

$value = apply_filters( $tag, $value, $var_1, $var_2, ... );

W istocie:
użyć apply_filters, aby filtrować dane $value- w odniesieniu do samej wartości, jak również ewentualnie przewidzianych zmiennych $var_1poprzez $var_n.


add_filter

Podpisz funkcję do określonej akcji filtrowania.

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Zasadniczo:
używasz add_filterfunkcji niestandardowej do podanej akcji filtrującej ( $tag), którą mogłeś wcześniej wygenerować apply_filters(lub była to wbudowana akcja filtrująca lub wynika z wtyczki / twojego motywu).


Oto fikcyjny przykład:

function print_initials( $name ) {

    if ( ! is_string( $name ) ) {
        return;
    }

    $fragments = explode( ' ', $name );

    /**
     * Filter wether to print initials in reverse order.
     *
     * @param bool $reverse Print initials in reverse order?
     */
    if ( apply_filters( 'reverse_initials', FALSE ) ) {
        $fragments = array_reverse( $fragments );
    }

    foreach ( $fragments as $f ) {
        echo substr( $f, 0, 1 );
    }
}

print_initials( 'Some Guy' ); // outputs: SG

add_filter( 'reverse_initials', '__return_true' );

print_initials( 'Some Guy' ); // outputs: GS

Teraz, jeśli po prostu wywołamy naszą funkcję taką, jaka jest, inicjały są drukowane od lewej do prawej - ponieważ to właśnie zdefiniowaliśmy jako zachowanie domyślne.

Za drugim razem otrzymujemy inicjały w odwrotnej kolejności - ponieważ funkcja filtru __return_true, która jest dołączona do naszej akcji filtrowania, zawsze powraca, TRUEa tym samym sprawia, że ​​inicjały są wysyłane od prawej do lewej.

tfrommen
źródło
3
To świetna odpowiedź i pokazuje, jak można zastąpić filtry. Dzięki.
Shawn