Este é o primeiro slide, tipicamente serve
para ver se o projector está a funcionar e
para eu ter a certeza que estamos no início
da apresentação e não algures no meio,
porque é um pincel mostrar um slide do
meio numa sala cheira de gente e andar
feito parvo à procura do primeiro. Podia ter
criado um slide todo preto? Sim, podia, mas
não era a mesma coisa.
HOOKS
For fun and profit
@zedejose
HOOKS
Was ist das?
ÚQUES
Let’s look at the trailer
“pontos de saída” (opcionais) que
alteram o comportamento ou
resultado de outra função.
estão disponíveis no core do
WordPress, em plugins e temas
existentes ou no nosso próprio
código.
input
resultado
REWIND
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
the_title();
endwhile;
endif;
function the_title (…) {
$title = get_the_title();
// etc…
if ( $echo )
echo $title;
else
return $title;
}
/wp-includes/post-template.php
function get_the_title( $post = 0 ) {
// a bunch of stuff…
return $title;
}
$post
$title
EXEMPLO NO WORDPRESS
<
function get_the_title( $post = 0 ) {
// a bunch of stuff…
return apply_filters( 'the_title', $title, $id );
}
$post
$title
NO WORDPRESS, COM HOOK
“aplica os filtros que foram
definidos noutro sítio do
código (core, tema ou plugins)”
apply_filters
filtro_do_titulo( … )
$title (modificado)
filtro_do_titulo_2( … )
$title (modificado)
filtro_do_titulo_1( … )
filtro_do_titulo_3( … )
Tipos de Hooks
Filtros
&
Acções(aqui é sem AO90)
Filtros
devolvem uma versão modificada do resultado de uma função
são definidos com apply_filters(), executados com add_filter()
Acções
modificam parâmetros ou variáveis globais
são definidas com do_action(), executadas com add_action()
Anatomia de um filtro
return apply_filters( 'the_title', $title, $id );
add_filter( 'the_title', 'filtro_do_titulo', 10, 2 );
um novo filtro
Anatomia de um filtro
return apply_filters( 'the_title', $title, $id );
add_filter( 'the_title', 'filtro_do_titulo', 10, 2 );
a minha função
prioridade
respeitando a definição
Anatomia de um filtro
o que é a “prioridade”?
Define a prioridade de execução
de um filtro (10 por omissão)
Valores mais pequenos indicam
maior prioridade.
Anatomia de um filtro
// Cria o filtro e indica a função.
add_filter( 'the_title', 'ze_filtro_do_titulo', 10, 2 );
// Modifica o título, cada palavra começa com uma maiúscula.
function ze_filtro_do_titulo( $title, $id ) {
$novo_titulo = ucwords( $title );
return $novo_titulo;
}
a função
Anatomia de um filtro
uma única função do core !== um único filtro
get_the_title, por exemplo, aplica dois filtros:
protected_title_format
e
the_title
Anatomia de uma acção
do_action( 'pre_get_posts', $query );
add_action( 'pre_get_posts', 'ze_muda_query', 10, 1 );
semelhante a um filtro
ou
add_action( 'pre_get_posts', 'ze_muda_query' );
Anatomia de uma acção
// Cria a acção e indica a função.
add_action( 'pre_get_posts', 'ze_muda_query' );
// Modifica a query.
function ze_muda_query( $query ) {
$query->set( 'post_type', array( 'post', 'products' ) );
// Não tem return.
}
não devolve valores, altera qualquer coisa
T.P.C.
Preparar um Dry Martini* e ler a documentação sobre:
has_filter()
current_filter()
remove_filter()
remove_all_filters()
has_action()
do_action_ref_array()
did_action()
remove_action()
remove_all_actions()
* http://bit.ly/TheOneDryMartini
?
RESPIRAR
https://codex.wordpress.org/Plugin_API/Hooks
HOOKS
the funky stuff
Quem nunca?
add_action( 'wp_enqueue_scripts', 'mete_la_o_css' );
add_action( 'wp_enqueue_scripts', 'mete_la_o_javascript' );
pre_get_posts
superpoderes
Modifica qualquer um das
dezenas de parâmetros de
WP_Query
https://codex.wordpress.org/Class_Reference/WP_Query
“WP_Query is a class that deals with the intricacies of
a post's (or page's) request to a WordPress blog. The
wp-blog-header.php (or the WP class in Version 2.0)
gives the $wp_query object information defining the
current request, and then $wp_query determines
what type of query it's dealing with (possibly a
category archive, dated archive, feed, or search), and
fetches the requested posts.”
WP_Query
https://codex.wordpress.org/Class_Reference/WP_Query
https://gist.github.com/luetkemj/2023628
// Cria a acção e indica a função.
add_action( 'pre_get_posts', 'inclui_bolos_no_loop' );
// Modifica a query.
function inclui_bolos_no_loop( $query ) {
if ( $query->is_main_query() && ! is_admin() {
$query->set( 'post_type', array( 'post', ‘bolo' ) );
}
}
Eu é mais bolos
// Cria a acção e indica a função.
add_action( 'pre_get_posts', 'exclui_categoria_3' );
// Modifica a query.
function exclui_categoria_3( $query ) {
if ( $query->is_main_query() && ! is_admin() {
$query->set( 'category__not_in', array( 3 ) );
}
}
Excluir uma categoria
! is_admin()
http://rachievee.com/the-wordpress-hooks-firing-sequence/
Cuidado com a sequência
HOOKS
Não é só o core
HOOKS
E eu e eu e eu e eu?
Hooks no meu código
porquê?
Porque, por muito que queiras, o teu código
nunca vai fazer exactamente aquilo que
uma instalação específica pede.
E muito menos aquilo que todas as
instalações específicas, que usam o teu
código, pedem.
Hooks no meu código
como?
do_action( 'ze__a_minha_accao', $argumentos );
$variavel = apply_filters( 'ze__o_meu_filtro', $variavel );
ou
return apply_filters( 'ze__o_meu_filtro', $variavel );
Hooks no meu código
não esquecer
return apply_filters( 'the_title', $title, $id );
add_filter( 'the_title', 'filtro_do_titulo', 10, 2 );
a minha função
prioridade
Hooks no meu código
• Extensível
• Flexível
• Elegante
• Developer friendly: reduz a
quantidade de código

(é o developer quem decide o que juntar)
• Gluten-free?
Hooks no meu código
exemplo
<footer>
    <?php do_action( 'ze_antes_do_footer' ); ?>
    <!-- coisas no footer do tema. cenas e tal -->
    <?php do_action( 'ze_depois_do_footer' ); ?>
</footer>
Hooks no meu código
exemplo
function ze_imagem_do_post() {
// Só dento do loop, fáxavor.
if ( has_post_thumbnail() ) {
$thumbnail = get_the_post_thumbnail();  
return apply_filters( 'ze_filtro_imagem_do_post', $thumbnail );
}
}
o developer pode agora “mexer” nisto
?
@zedejose
Obrigado

Hooks, o condimento mágico e escondido do WordPress

  • 1.
    Este é oprimeiro slide, tipicamente serve para ver se o projector está a funcionar e para eu ter a certeza que estamos no início da apresentação e não algures no meio, porque é um pincel mostrar um slide do meio numa sala cheira de gente e andar feito parvo à procura do primeiro. Podia ter criado um slide todo preto? Sim, podia, mas não era a mesma coisa.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
    “pontos de saída”(opcionais) que alteram o comportamento ou resultado de outra função.
  • 7.
    estão disponíveis nocore do WordPress, em plugins e temas existentes ou no nosso próprio código.
  • 8.
  • 9.
    if ( have_posts()) : while ( have_posts() ) : the_post(); the_title(); endwhile; endif;
  • 10.
    function the_title (…){ $title = get_the_title(); // etc… if ( $echo ) echo $title; else return $title; } /wp-includes/post-template.php
  • 11.
    function get_the_title( $post = 0) { // a bunch of stuff… return $title; } $post $title EXEMPLO NO WORDPRESS
  • 12.
    < function get_the_title( $post = 0) { // a bunch of stuff… return apply_filters( 'the_title', $title, $id ); } $post $title NO WORDPRESS, COM HOOK
  • 13.
    “aplica os filtrosque foram definidos noutro sítio do código (core, tema ou plugins)” apply_filters
  • 14.
  • 15.
    filtro_do_titulo_2( … ) $title(modificado) filtro_do_titulo_1( … ) filtro_do_titulo_3( … )
  • 16.
  • 17.
    Filtros devolvem uma versãomodificada do resultado de uma função são definidos com apply_filters(), executados com add_filter() Acções modificam parâmetros ou variáveis globais são definidas com do_action(), executadas com add_action()
  • 18.
    Anatomia de umfiltro return apply_filters( 'the_title', $title, $id ); add_filter( 'the_title', 'filtro_do_titulo', 10, 2 ); um novo filtro
  • 19.
    Anatomia de umfiltro return apply_filters( 'the_title', $title, $id ); add_filter( 'the_title', 'filtro_do_titulo', 10, 2 ); a minha função prioridade respeitando a definição
  • 20.
    Anatomia de umfiltro o que é a “prioridade”? Define a prioridade de execução de um filtro (10 por omissão) Valores mais pequenos indicam maior prioridade.
  • 21.
    Anatomia de umfiltro // Cria o filtro e indica a função. add_filter( 'the_title', 'ze_filtro_do_titulo', 10, 2 ); // Modifica o título, cada palavra começa com uma maiúscula. function ze_filtro_do_titulo( $title, $id ) { $novo_titulo = ucwords( $title ); return $novo_titulo; } a função
  • 22.
    Anatomia de umfiltro uma única função do core !== um único filtro get_the_title, por exemplo, aplica dois filtros: protected_title_format e the_title
  • 23.
    Anatomia de umaacção do_action( 'pre_get_posts', $query ); add_action( 'pre_get_posts', 'ze_muda_query', 10, 1 ); semelhante a um filtro ou add_action( 'pre_get_posts', 'ze_muda_query' );
  • 24.
    Anatomia de umaacção // Cria a acção e indica a função. add_action( 'pre_get_posts', 'ze_muda_query' ); // Modifica a query. function ze_muda_query( $query ) { $query->set( 'post_type', array( 'post', 'products' ) ); // Não tem return. } não devolve valores, altera qualquer coisa
  • 25.
    T.P.C. Preparar um DryMartini* e ler a documentação sobre: has_filter() current_filter() remove_filter() remove_all_filters() has_action() do_action_ref_array() did_action() remove_action() remove_all_actions() * http://bit.ly/TheOneDryMartini
  • 26.
  • 27.
  • 28.
    Quem nunca? add_action( 'wp_enqueue_scripts','mete_la_o_css' ); add_action( 'wp_enqueue_scripts', 'mete_la_o_javascript' );
  • 29.
    pre_get_posts superpoderes Modifica qualquer umdas dezenas de parâmetros de WP_Query https://codex.wordpress.org/Class_Reference/WP_Query
  • 30.
    “WP_Query is aclass that deals with the intricacies of a post's (or page's) request to a WordPress blog. The wp-blog-header.php (or the WP class in Version 2.0) gives the $wp_query object information defining the current request, and then $wp_query determines what type of query it's dealing with (possibly a category archive, dated archive, feed, or search), and fetches the requested posts.” WP_Query https://codex.wordpress.org/Class_Reference/WP_Query
  • 38.
  • 39.
    // Cria aacção e indica a função. add_action( 'pre_get_posts', 'inclui_bolos_no_loop' ); // Modifica a query. function inclui_bolos_no_loop( $query ) { if ( $query->is_main_query() && ! is_admin() { $query->set( 'post_type', array( 'post', ‘bolo' ) ); } } Eu é mais bolos
  • 40.
    // Cria aacção e indica a função. add_action( 'pre_get_posts', 'exclui_categoria_3' ); // Modifica a query. function exclui_categoria_3( $query ) { if ( $query->is_main_query() && ! is_admin() { $query->set( 'category__not_in', array( 3 ) ); } } Excluir uma categoria
  • 41.
  • 43.
  • 44.
  • 46.
    HOOKS E eu eeu e eu e eu?
  • 47.
    Hooks no meucódigo porquê? Porque, por muito que queiras, o teu código nunca vai fazer exactamente aquilo que uma instalação específica pede. E muito menos aquilo que todas as instalações específicas, que usam o teu código, pedem.
  • 48.
    Hooks no meucódigo como? do_action( 'ze__a_minha_accao', $argumentos ); $variavel = apply_filters( 'ze__o_meu_filtro', $variavel ); ou return apply_filters( 'ze__o_meu_filtro', $variavel );
  • 49.
    Hooks no meucódigo não esquecer return apply_filters( 'the_title', $title, $id ); add_filter( 'the_title', 'filtro_do_titulo', 10, 2 ); a minha função prioridade
  • 50.
    Hooks no meucódigo • Extensível • Flexível • Elegante • Developer friendly: reduz a quantidade de código
 (é o developer quem decide o que juntar) • Gluten-free?
  • 51.
    Hooks no meucódigo exemplo <footer>     <?php do_action( 'ze_antes_do_footer' ); ?>     <!-- coisas no footer do tema. cenas e tal -->     <?php do_action( 'ze_depois_do_footer' ); ?> </footer>
  • 52.
    Hooks no meucódigo exemplo function ze_imagem_do_post() { // Só dento do loop, fáxavor. if ( has_post_thumbnail() ) { $thumbnail = get_the_post_thumbnail();   return apply_filters( 'ze_filtro_imagem_do_post', $thumbnail ); } } o developer pode agora “mexer” nisto
  • 54.
  • 55.