{"id":233488,"date":"2023-02-15T19:49:00","date_gmt":"2023-02-15T16:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233488"},"modified":"2022-11-10T23:58:22","modified_gmt":"2022-11-10T20:58:22","slug":"guia-todo-sobre-hooks-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/guia-todo-sobre-hooks-en-wordpress\/","title":{"rendered":"Gu\u00eda: Todo sobre Hooks en WordPress"},"content":{"rendered":"\n<p>\u00bfAlguna vez le han dicho que la soluci\u00f3n a su problema es que necesita &quot;engancharse&quot; a algo para hacer lo suyo o lo usa <code>add_filter<\/code>sin entender realmente por qu\u00e9 estropea las cosas? Los ganchos constituyen la base de WordPress y proporcionan temas y complementos una forma de interactuar o modificar c\u00f3digo En esta publicaci\u00f3n, desglosaremos qu\u00e9 son los ganchos, c\u00f3mo funcionan y c\u00f3mo podemos usarlos.<\/p>\n<h2>\u00bfQu\u00e9 son los ganchos?<\/h2>\n<p>A medida que WordPress ejecuta su c\u00f3digo (desde el comienzo de la carga de clases, la carga de complementos, la carga del tema, la consulta de la solicitud actual y finalmente la representaci\u00f3n del HTML), pasa por un mont\u00f3n de &quot;puntos de control&quot;; manos. Cuando se encuentra un gancho, WordPress detendr\u00e1 lo que est\u00e1 haciendo y verificar\u00e1 si hay alguna funci\u00f3n (en el tema, el complemento o el propio WordPress) que est\u00e9 registrada para ejecutarse en este gancho. Si las hay, WordPress ejecutar\u00e1 todas esas funciones y luego continuar\u00e1 donde lo dej\u00f3.<\/p>\n<p>Esto hace posible que los complementos, los temas y el propio WordPress se &quot;enganchen&quot; a ciertos puntos para agregar, por ejemplo, hojas de estilo en la <code>&lt;head&gt;<\/code>etiqueta del tema, modificar c\u00f3mo WordPress consulta las publicaciones o simplemente cambiar el contenido de la publicaci\u00f3n si as\u00ed lo desea.<\/p>\n<p>Hay dos tipos de anzuelos; acciones y filtros. Funcionan de manera bastante similar entre s\u00ed, pero con una excepci\u00f3n que veremos m\u00e1s de cerca a continuaci\u00f3n.<\/p>\n<h2>Acciones y filtros<\/h2>\n<p>Para conectarse a una acci\u00f3n o filtro, debe definir qu\u00e9 enlace (por su nombre) desea usar y definir una devoluci\u00f3n de llamada, que es el nombre de la funci\u00f3n que desea ejecutar. En la mayor\u00eda de los casos, los ganchos proporcionan par\u00e1metros o variables que son relevantes para el gancho.<\/p>\n<p>Las acciones son simplemente \u00abpuntos de control&quot; en la ejecuci\u00f3n de WordPress, donde puedes realizar una tarea o hacer eco de algo. En algunos casos raros, puede modificar un objeto (proporcionado en los par\u00e1metros), de modo que todas las ejecuciones siguientes funcionen con ese objeto modificado.<\/p>\n<p>Los filtros son para cambiar una variable o salida. Todos los enlaces de filtro proporcionar\u00e1n la variable que puede cambiar como primer par\u00e1metro y le permitir\u00e1n modificarla o devolver algo diferente.<\/p>\n<p>WordPress ejecuta muchos ganchos, pero puede crear los suyos propios en su complemento o tema. Esto permite a los desarrolladores ampliar y modificar su c\u00f3digo; por ejemplo, modificar un complemento a trav\u00e9s de un tema o modificar el tema principal a trav\u00e9s del tema secundario.<\/p>\n<p>Muchas de las funciones de WordPress, que normalmente se usan para imprimir publicaciones, tambi\u00e9n son filtros o acciones. Por ejemplo, la funci\u00f3n <code>the_title()<\/code>imprime el t\u00edtulo de la publicaci\u00f3n, pero tambi\u00e9n es un filtro.<\/p>\n<p>Veamos c\u00f3mo los conectamos en la pr\u00e1ctica.<\/p>\n<h2>Enganchado a acciones<\/h2>\n<p>Para engancharte a una acci\u00f3n, usas el m\u00e9todo <code>add_action()<\/code>. Como m\u00ednimo requiere dos par\u00e1metros; el nombre del enlace y la devoluci\u00f3n de llamada; el nombre de la funci\u00f3n que desea ejecutar. Opcionalmente, puede proporcionar prioridad como tercer par\u00e1metro y definir la cantidad de argumentos que se pasar\u00e1n a su funci\u00f3n de devoluci\u00f3n de llamada. Veremos los dos par\u00e1metros opcionales m\u00e1s adelante, pero por ahora, aqu\u00ed hay un ejemplo de <code>add_action<\/code>:<\/p>\n<pre><code>add_action('init', 'my_function_name');\nfunction my_function_name() {\n    \/\/ Do your stuff\n}<\/code><\/pre>\n<p>El primer par\u00e1metro para <code>add_action<\/code>es el nombre de la acci\u00f3n; en este caso <code>init<\/code>, que es un gancho de WordPress bastante com\u00fan que ocurre durante la inicializaci\u00f3n. El segundo par\u00e1metro es su devoluci\u00f3n de llamada, en este caso el nombre de la funci\u00f3n que deseamos ejecutar. Luego, todo lo que necesita hacer es definir una funci\u00f3n con ese nombre y agregar su c\u00f3digo dentro de ella.<\/p>\n<p>Tambi\u00e9n puede usar funciones an\u00f3nimas, que es donde define la funci\u00f3n interna <code>add_action<\/code>en lugar de proporcionar un nombre de funci\u00f3n, as\u00ed;<\/p>\n<pre><code>add_action('init', function() {\n    \/\/ Do your stuff\n});<\/code><\/pre>\n<p>Muchos desarrolladores prefieren este m\u00e9todo ya que evita el riesgo de redefinir una funci\u00f3n de PHP con el mismo nombre.<\/p>\n<p>Si necesita ejecutar una funci\u00f3n definida dentro de una clase de PHP, debe proporcionar una matriz como par\u00e1metro de devoluci\u00f3n de llamada; donde el primer elemento es el objeto de clase y el segundo elemento es el nombre de la funci\u00f3n:<\/p>\n<pre><code>class MyClass {\n    public function __construct() {\n        add_action('init', [$this, 'myFunctionName']);\n    }\n\u00a0\n    public function myFunctionName() {\n        \/\/ Do your stuff\n    }\n}<\/code><\/pre>\n<h2>Enganchado a filtros<\/h2>\n<p>Para enganchar a un filtro, utiliza la funci\u00f3n <code>add_filter()<\/code>. De manera similar a las acciones anteriores, el primer par\u00e1metro es el nombre del filtro y el segundo es su devoluci\u00f3n de llamada. Opcionalmente, puede proporcionar la prioridad como tercer par\u00e1metro y el n\u00famero de argumentos como cuarto. Aqu\u00ed hay un ejemplo de <code>add_filter<\/code>:<\/p>\n<pre><code>add_filter('the_title', 'my_function_name');\nfunction my_function_name($title) {\n    \/\/ Do your stuff\n    return $title;\n}<\/code><\/pre>\n<p>En el ejemplo anterior, nos conectamos al filtro <code>the_title<\/code>(que imprime el t\u00edtulo de la publicaci\u00f3n) y le indicamos a WordPress que ejecute nuestra funci\u00f3n. Todos los filtros siempre proporcionar\u00e1n un argumento; la variable a cambiar. En mi funci\u00f3n lo nombr\u00e9 porque <code>$title<\/code>s\u00e9 que contiene el t\u00edtulo de la publicaci\u00f3n. Dentro de la funci\u00f3n puedo modificarla o anular completamente la variable. Es importante recordar que en los filtros <strong>siempre debes devolver la variable<\/strong>. Si no devuelve algo en su funci\u00f3n de devoluci\u00f3n de llamada, la variable se vac\u00eda. Si omit\u00ed la declaraci\u00f3n de devoluci\u00f3n en el ejemplo anterior, ning\u00fan t\u00edtulo de publicaci\u00f3n har\u00eda eco en ninguna parte.<\/p>\n<p>El argumento variable y la regla de devolver algo en su funci\u00f3n de devoluci\u00f3n de llamada es pr\u00e1cticamente la \u00fanica diferencia entre filtros y acciones. Todo lo dem\u00e1s funciona igual. Puede seguir los ejemplos de funciones y clases an\u00f3nimas que se muestran para las acciones anteriores para los filtros, as\u00ed como la prioridad de los par\u00e1metros opcionales y la cantidad de argumentos; que veremos a continuaci\u00f3n.<\/p>\n<h2>Prioridad<\/h2>\n<p>El tercer par\u00e1metro (opcional) de <code>add_action<\/code>y <code>add_filter<\/code>es un n\u00famero entero que define la prioridad de su funci\u00f3n de devoluci\u00f3n de llamada. Esto es \u00fatil en los casos en que hay m\u00faltiples funciones (no necesariamente de usted en su tema o complemento, recuerde que WordPress usa sus propios ganchos) y necesita decidir cu\u00e1l ejecutar primero.<\/p>\n<p>Si no se proporciona ninguna prioridad, el valor predeterminado es 10. Cuanto menor sea la prioridad, antes se ejecutar\u00e1, y cuanto mayor sea la prioridad, m\u00e1s tarde se ejecutar\u00e1. No puede proporcionar una prioridad negativa.<\/p>\n<p>Imagine varias funciones de devoluci\u00f3n de llamada registradas en <code>init<\/code>. Si no se proporcion\u00f3 prioridad para varias devoluciones de llamada, WordPress las ejecutar\u00e1 en el orden en que se encontraron (por ejemplo, en <code>functions.php<\/code>el c\u00f3digo de su complemento).<\/p>\n<pre><code>add_action('init', 'my_function_name');\nadd_action('init', 'my_second_function_name');\nadd_action('init', 'my_third_function_name', 12);\nadd_action('init', 'my_fourth_function_name', 1);<\/code><\/pre>\n<p>Este ser\u00eda el orden en el que WordPress ejecutar\u00e1 las devoluciones de llamada anteriores:<\/p>\n<ol>\n<li><code>my_fourth_function_name<\/code>(Prioridad 1)<\/li>\n<li><code>my_function_name<\/code>(prioridad 10)<\/li>\n<li><code>my_second_function_name<\/code>(prioridad 10, pero aparece m\u00e1s tarde en el c\u00f3digo)<\/li>\n<li><code>my_third_function_name<\/code>(prioridad 12)<\/li>\n<\/ol>\n<h2>N\u00famero de argumentos<\/h2>\n<p>Por lo general, los enlaces proporcionan algunos datos adicionales que son relevantes y \u00fatiles para las funciones de devoluci\u00f3n de llamada. Por ejemplo, la acci\u00f3n <code>save_post<\/code>(se ejecuta cada vez que se actualiza una publicaci\u00f3n) proporciona dos argumentos posibles; el ID de la publicaci\u00f3n y el objeto de la publicaci\u00f3n. Estos son \u00fatiles para las operaciones que normalmente necesita ejecutar en este enlace (por ejemplo, si desea guardar una publicaci\u00f3n meta, necesita la ID de la publicaci\u00f3n).<\/p>\n<p>Si no se proporcion\u00f3 una cantidad de argumentos para una acci\u00f3n o filtro, el valor predeterminado es 1. Es por eso que no necesita definir 1 <code>add_filter<\/code>para acceder a la variable a la que est\u00e1 conectado el filtro. Sin embargo, las acciones no pueden pasar argumentos aunque el n\u00famero de argumentos est\u00e9 establecido en 1 de forma predeterminada.<\/p>\n<p>Veamos un ejemplo de c\u00f3mo definir el n\u00famero de argumentos y c\u00f3mo accedemos a ellos en nuestra funci\u00f3n de devoluci\u00f3n de llamada:<\/p>\n<pre><code>add_action('save_post', 'my_function_name', 10, 2);\nfunction my_function_name($post_id, $post) {\n    \/\/ Do your stuff\n}<\/code><\/pre>\n<p>En el ejemplo anterior, le decimos a WordPress que pase dos argumentos a nuestra funci\u00f3n de devoluci\u00f3n de llamada. Recuerde que necesitamos definir la prioridad como tercer par\u00e1metro, por lo que generalmente definimos el valor predeterminado, que es 10. En cuanto a nuestra funci\u00f3n de devoluci\u00f3n de llamada, ahora podemos definir los mismos argumentos num\u00e9ricos que solicitamos, en el ejemplo anterior fue 2.<\/p>\n<p>Si en el ejemplo anterior tuvi\u00e9ramos establecido el n\u00famero de argumentos en 1, solo se completar\u00eda el primer argumento en nuestra funci\u00f3n de devoluci\u00f3n de llamada. El segundo, <code>$post<\/code>ser\u00eda indefinido.<\/p>\n<h2>\u00bfQu\u00e9 sucede si necesitamos datos que no se pasaron en el enlace?<\/h2>\n<p>Depende totalmente del desarrollador que cre\u00f3 el enlace definir qu\u00e9 argumentos se pueden pasar. Esto significa que no puede simplemente forzar qu\u00e9 argumentos desea o necesita en su <code>add_action<\/code>o <code>add_filter<\/code>. Por suerte en la mayor\u00eda de los casos tenemos alternativas para conseguir las variables que necesitamos. Si se conecta a una acci\u00f3n o filtro donde sabe que se deben definir ciertas variables globales, puede acceder a estas variables globales en su funci\u00f3n de devoluci\u00f3n de llamada. Adem\u00e1s, WordPress tiene una <a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">amplia gama de etiquetas condicionales<\/a> que puede usar en sus funciones enganchadas (con la excepci\u00f3n de los enlaces muy tempranos que ocurren antes de que WordPress defina estas etiquetas condicionales)<\/p>\n<p>Veamos un ejemplo de acceso a variables globales. El filtro <code>the_title<\/code>proporciona el ID de la publicaci\u00f3n como argumento opcional, al que podemos acceder defini\u00e9ndolo como un argumento aceptable;<\/p>\n<pre><code>add_filter('the_title', 'my_function_name', 10, 2);\nfunction my_function_name($title, $post_id) {\n    if ($post_id == 1) {\n        return 'First post ever!';\n    }\n    return $title;\n}<\/code><\/pre>\n<p>Sin embargo, podemos lograr el mismo resultado por;<\/p>\n<pre><code>add_filter('the_title', 'my_function_name');\nfunction my_function_name($title) {\n    global $post;\n    if ($post-&gt;ID == 1) {\n        return 'First post ever!';\n    }\n    return $title;\n}<\/code><\/pre>\n<p>Si sabe que una variable global est\u00e1 definida por el punto en que se ejecuta el enlace, puede definirla como global en su funci\u00f3n de devoluci\u00f3n de llamada y acceder a los datos desde all\u00ed. Por ejemplo, definir <code>global $wp_query<\/code>en el ejemplo anterior tambi\u00e9n le dar\u00eda acceso al objeto wp_query completo dentro de la devoluci\u00f3n de llamada de su funci\u00f3n.<\/p>\n<p><a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Las etiquetas condicionales de WordPress<\/a> son extremadamente \u00fatiles. A menos que est\u00e9 enganchado a un gancho que ocurre muy temprano en la ejecuci\u00f3n de WordPress, est\u00e1n disponibles. Hay etiquetas condicionales para verificar en qu\u00e9 p\u00e1gina (plantilla) se encuentra, si est\u00e1 dentro de un men\u00fa o un ciclo de publicaci\u00f3n, y mucho m\u00e1s. Por ejemplo, al modificar la consulta de publicaci\u00f3n usando el enlace <code>pre_get_posts<\/code>, es muy \u00fatil asegurarse de que su c\u00f3digo solo se ejecute en ciertos casos. Por ejemplo;<\/p>\n<pre><code>add_action('pre_get_posts', 'my_function_name');\nfunction my_function_name($query) {\n    if (!is_admin()) {\n        \/\/ Do your stuff\n    }\n}<\/code><\/pre>\n<p>Debido a que el enlace <code>pre_get_posts<\/code>se ejecuta tanto en el administrador como en la interfaz, podemos usar una etiqueta condicional para garantizar que nuestro c\u00f3digo solo afecte la consulta de la interfaz.<\/p>\n<h2>Creando tus propios ganchos<\/h2>\n<p>Puede definir sus propias acciones y filtros. Si usted es un desarrollador de temas o complementos, le recomendamos que lo haga para permitir que otros modifiquen su c\u00f3digo sin cambiar el c\u00f3digo fuente.<\/p>\n<p>Registre una acci\u00f3n con <code>do_action()<\/code>y registre un filtro con <code>apply_filters()<\/code>.<\/p>\n<p>El <code>do_action()<\/code>requiere un m\u00ednimo de 1 par\u00e1metro; el nombre del anzuelo. Tenga en cuenta que el nombre del enlace debe ser \u00fanico (no lo llame, por ejemplo, <code>init<\/code>ya que este es un enlace central de WordPress). Coloque el lugar <code>do_action()<\/code>donde desee que aparezca el gancho. Por ejemplo, puede colocar el gancho en el <code>header.php<\/code>, justo despu\u00e9s del cuerpo de su tema para definir un gancho donde los desarrolladores pueden generar scripts u otro contenido.<\/p>\n<pre><code>...\n&lt;body&gt;\n    &lt;?php do_action('mytheme_after_body'); ?&gt;<\/code><\/pre>\n<p>Puede agregar tantos par\u00e1metros <code>do_action<\/code>como desee despu\u00e9s del nombre del gancho. Trate de tener en cuenta qu\u00e9 datos necesitar\u00edan los desarrolladores en sus ganchos, que de otro modo no ser\u00edan f\u00e1cilmente accesibles.<\/p>\n<p>El <code>apply_filters()<\/code>requiere un m\u00ednimo de 2 par\u00e1metros; el nombre del enlace y la variable en la que est\u00e1 registrando el filtro. Por ejemplo, su tema puede registrar un filtro alrededor de algunas clases HTML para permitir que los desarrolladores las modifiquen o agreguen:<\/p>\n<pre><code>&lt;section class=\"&lt;?php echo apply_filters('mytheme_section_classes', 'section default-class'); ?&gt;\"&gt;\n    ...\n&lt;\/section&gt;<\/code><\/pre>\n<p>Al igual que con las acciones, puede agregar tantos par\u00e1metros <code>apply_filters<\/code>como desee despu\u00e9s de los dos par\u00e1metros obligatorios.<\/p>\n<h2>Conclusi\u00f3n y recursos \u00fatiles<\/h2>\n<p>Con esto, espero que haya logrado una comprensi\u00f3n s\u00f3lida de c\u00f3mo WordPress ejecuta la mayor parte de su c\u00f3digo, c\u00f3mo puede modificar el c\u00f3digo y c\u00f3mo usted, como desarrollador, puede permitir que otros desarrolladores tambi\u00e9n realicen modificaciones en su c\u00f3digo.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a\u00f1adir_acci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A\u00f1adir filtro<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Etiquetas condicionales de WordPress<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hacer_acci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aplicar_filtros<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta gu\u00eda para principiantes, aprenderemos qu\u00e9 son los ganchos y filtros de WordPress, c\u00f3mo funcionan y c\u00f3mo usarlos.<\/p>\n","protected":false},"author":1,"featured_media":153117,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[924,892,892,716,716,831,1110,831,924,840,840,861,861],"tags":[1172],"class_list":["post-233488","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asignaturas","category-codigo","category-desarrollador","category-guia-para-principiantes","category-n-a","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233488"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233488\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/153117"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}