do_action y métodos hook

2

Estoy tratando de entender cómo funcionan los métodos de enganche en WordPress. Entiendo que cuando do_action se llama, WP busca todos los oyentes registrados y los invoca de acuerdo con la prioridad establecida.

¿Cómo recopila el núcleo de WordPress todos los métodos de enlace registrados en diferentes archivos? Por ejemplo, he declarado add_action para wp_head en mi pie de página. ¿Será ejecutado? Entonces, ¿parece que WordPress debería recopilar todos los datos iterando sobre todos los archivos?

Por favor, explique esto.

    
pregunta Ptzhub 18.06.2016 - 14:51

2 respuestas

5

Su analogía aquí es parcialmente correcta, pero incompleta:

  

Entiendo que cuando do_action se llama wp busca todos los registrados   escuchas y las invoca de acuerdo a la prioridad establecida.

Debe considerar lo que sucede cuando llama a add_action . WordPress nunca busca las declaraciones add_action , las tiene en una lista. Cuando llama a add_action , se actualiza una lista de devoluciones de llamada a las que se debe llamar cuando ocurre esa acción.

Teniendo esto en cuenta, es más útil usar una analogía de eventos.

  • do_action( 'init' ) Dispara la acción 'init'
  • add_action('init', 'myfunction' ) Cuando ocurre el evento init , llame a myfunction
  • function myfunction() {} Ah, ocurrió el evento init

La analogía de los eventos ayuda enormemente a la hora de comprender cómo funcionan las acciones y los filtros, porque hay toda una clase de problemas que ocurren cuando no se entienden relacionados con el tiempo.

Tomemos su ejemplo de llamar a add_action en el pie de página para la acción wp_head . wp_head se dispara cuando se llama a wp_head() , lo que debería ocurrir en el encabezado entre las etiquetas <header> . Si intentamos agregar una acción en el pie de página, se agregará, y la próxima vez que se llame a wp_head() se activará. Pero ya se ha llamado a wp_head , es demasiado tarde. Es como pedirle a un niño que "recuerde empacar su maleta antes de la fiesta" justo después de que la fiesta haya terminado.

Teniendo esto en cuenta, tengo algunas reglas y recomendaciones generales que actuarían como heurísticas para un código más mantenible:

  • Poner todo el código dentro de las funciones que se activan en eventos. init , after_theme_setup , wp_head , y admin_init deberían cubrir la mayor parte
  • El único código fuera de un enlace o filtro serían los archivos de plantilla, y las llamadas iniciales add_action
  • No agregue filtros ni enlaces dentro de las plantillas, hágalos en functions.php o en un complemento, o si esos archivos usan las declaraciones include o require para una carpeta de inclusión

Hay algunas situaciones en las que querrás romper esas reglas, generalmente para evitar recursiones al guardar cosas, etc., pero esas deberían ser raras excepciones. Experimente y vea qué funciona, y vea esta publicación que muestra qué acciones se activan cuándo y qué es seguro usar en esas veces

Una nota final, las acciones y los filtros son lo mismo. Internamente reciben el mismo trato, pero hay algunas diferencias importantes si quieres que las cosas funcionen bien:

  • Las acciones hacen cosas
  • Los filtros modifican las cosas
  • Las acciones no necesitan devolver nada
  • Los filtros se pasan a lo que se 'filtra' como primer argumento y siempre lo devuelven o una versión modificada
  • Los filtros se llaman mucho, por lo que nunca haga un trabajo pesado en los filtros, se ralentizarán las cosas masivamente, solo modificar, hacer trabajo es para lo que se hacen las acciones
  • Tenga cuidado de engancharse a los filtros de traducción y escape, puede ser peligroso y tiene un gran impacto en el rendimiento, ya que esos son los filtros más comúnmente llamados
  • Hay una acción / filtro especialmente peligroso llamado all , que se activará para cada filtro y gancho. A veces es útil para la depuración, pero recomiendo usar un complemento como el monitor de consultas en su lugar.
respondido por el Tom J Nowell 18.06.2016 - 15:50
0

Todas sus acciones pertenecen a su functions.php , suponiendo que está creando un tema. Aquí es donde agrega acciones a ciertos eventos en sus plantillas.

Ahora, una vez que haya leído functions.php WP tiene una lista de acciones que se supone que debe realizar en ciertos puntos de sus plantillas de temas. Hay varios ganchos de acción predefinidos, como wp_head() y wp_footer() , que son abreviados para do_action('wp_head') y do_action('wp_footer') . Están definidos, por lo que los complementos tienen lugares estándar donde pueden agregar su acción. También puede definir sus propios ganchos de acción con do_action .

Así, por ejemplo, si desea agregar la misma imagen al final de cada publicación, definiría en su functions.php la siguiente acción:

add_action ('my_post_image', 'generate_my_post_image');
function generate_my_post_image () {
    echo '<img src="path_to_my_image">';
    }

Luego, en tu index.php tendrías:

while (have_posts()) {
    ... generate your post ...
    do_action ('my_post_image');
    }
    
respondido por el cjbj 18.06.2016 - 15:31

Lea otras preguntas en las etiquetas