{"id":33694,"date":"2020-05-30T03:00:50","date_gmt":"2020-05-30T10:00:50","guid":{"rendered":"https:\/\/kinsta.com\/?p=72202"},"modified":"2023-08-23T17:28:41","modified_gmt":"2023-08-23T15:28:41","slug":"wordpress-hooks","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/","title":{"rendered":"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?"},"content":{"rendered":"<p>Los ganchos de WordPress son una de las herramientas m\u00e1s importantes para tener en el <a href=\"https:\/\/kinsta.com\/es\/blog\/contratar-desarrollador-de-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">arsenal<\/a> de un <a href=\"https:\/\/kinsta.com\/es\/blog\/contratar-desarrollador-de-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">desarrollador de WordPress<\/a>. Son la base del desarrollo de plugins y temas de WordPress. Puedes usar los muchos ganchos incorporados de WordPress para \u00abengancharte\u00bb al n\u00facleo de WordPress con tu c\u00f3digo personalizado y <strong>hacer<\/strong> o <strong>modificar<\/strong> algo.<\/p>\n<p>Hay dos tipos de ganchos de WordPress: <strong>Acciones<\/strong> y <strong>Filtros<\/strong>. Los ganchos son tan comunes que hasta el n\u00facleo de WordPress los usa extensamente por s\u00ed mismo. WordPress tambi\u00e9n incluye una forma de definir tus propios <strong>ganchos personalizados<\/strong> para que otros desarrolladores puedan engancharse a tu c\u00f3digo.<\/p>\n<p>Aprender c\u00f3mo funcionan las acciones, los filtros y los ganchos personalizados es esencial para dominar el desarrollo de WordPress.<\/p>\n<p>La primera mitad de este art\u00edculo cubre los fundamentos de los ganchos de WordPress y explica c\u00f3mo funcionan con m\u00faltiples ejemplos. En la segunda mitad, aprender\u00e1s c\u00f3mo puedes usar los ganchos para personalizar WordPress, crear tus propios ganchos personalizados y usarlos para construir tus propios plugins extensibles.<\/p>\n<p>\u00bfSuena emocionante? \u00a1Vamos a sumergirnos!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>\u00bfQu\u00e9 son los ganchos de WordPress?<\/h2>\n<p>Una <a href=\"https:\/\/kinsta.com\/es\/blog\/duplicar-publicacion-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de WordPress<\/a> est\u00e1 ensamblada por toneladas de funciones y consultas a bases de datos. El n\u00facleo de WordPress, los plugins y el tema trabajan juntos para producir los elementos de la p\u00e1gina como texto, <a href=\"https:\/\/kinsta.com\/es\/blog\/jpg-vs-jpeg\/\" target=\"_blank\" rel=\"noopener noreferrer\">im\u00e1genes<\/a>, scripts y estilos. Una vez ensamblados, el navegador los pone todos juntos y muestra la p\u00e1gina.<\/p>\n<p>Los ganchos de WordPress te permiten \u00abengancharte\u00bb a este proceso de construcci\u00f3n en ciertos puntos y ejecutar tu c\u00f3digo personalizado. La funci\u00f3n principal de los ganchos es permitirte modificar o a\u00f1adir caracter\u00edsticas a WordPress sin tocar los <a href=\"https:\/\/kinsta.com\/es\/docs\/soporte\/alcance-del-soporte\/alcance-del-soporte-para-wordpress-administrado\/#what-is-wordpress-core\" target=\"_blank\" rel=\"noopener noreferrer\">archivos centrales<\/a>.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/basicos-de-ganchos-de-wordpress.png\" alt=\"Los ganchos te ayudar\u00e1n a extender WordPress con tu propio c\u00f3digo\" width=\"1100\" height=\"502\"><figcaption class=\"wp-caption-text\">Los ganchos te ayudar\u00e1n a extender WordPress con tu propio c\u00f3digo<\/figcaption><\/figure>\n<p>La <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/\" target=\"_blank\" rel=\"noopener noreferrer\">API del plugin de WordPress<\/a> potencia la funcionalidad de los ganchos de WordPress. Los ganchos se utilizan llamando a ciertas funciones de WordPress llamadas <strong>Funciones de Gancho<\/strong> en instancias espec\u00edficas durante el tiempo de ejecuci\u00f3n de WordPress.<\/p>\n<p>Usando las funciones de gancho, puedes agrupar tu c\u00f3digo personalizado dentro de una <strong>funci\u00f3n de callback <\/strong>y registrarlo con cualquier gancho. Una vez registrado, esta callback se ejecutar\u00e1 dondequiera que est\u00e9 el gancho, permiti\u00e9ndote aumentar o reemplazar las funciones predeterminadas de WordPress.<\/p>\n<p>La posici\u00f3n del gancho en el proceso de ejecuci\u00f3n del c\u00f3digo es un factor importante. Aprender\u00e1s m\u00e1s sobre su importancia en las pr\u00f3ximas secciones.<\/p>\n\n<h3>Dos tipos de ganchos de WordPress: Acciones y Filtros<\/h3>\n<p>WordPress incluye dos tipos de ganchos llamados <strong>Acciones<\/strong> y <strong>Filtros<\/strong>. Las Acciones te permiten <strong>hacer<\/strong> algo en ciertos puntos predefinidos en el tiempo de ejecuci\u00f3n de WordPress, mientras que los Filtros te permiten <strong>modificar<\/strong> cualquier dato procesado por WordPress y devolverlo.<\/p>\n<p>Las acciones se definen en el c\u00f3digo de WordPress como:<\/p>\n<pre><code class=\"language-php\">do_action( 'action_name', [optional_arguments] );<\/code><\/pre>\n<p>La cadena <strong><code>action_name<\/code><\/strong> es el nombre de la acci\u00f3n. Puedes especificar la variable <strong><code>[optional_arguments]<\/code><\/strong> para pasar argumentos adicionales a la funci\u00f3n de callback. Si no se especifica este campo, entonces su valor por defecto estar\u00e1 vac\u00edo.<\/p>\n<p><strong>Ejemplo:<\/strong> La acci\u00f3n <strong><code>do_action( 'wp_head' )<\/code><\/strong> puede ser enganchada para ejecutar c\u00f3digo personalizado cada vez que WordPress procesa el <a href=\"https:\/\/kinsta.com\/es\/blog\/agregar-codigo\/\" target=\"_blank\" rel=\"noopener noreferrer\">encabezado del sitio<\/a>. Esta acci\u00f3n no tiene ning\u00fan otro argumento.<\/p>\n<p>Los filtros est\u00e1n definidos en el c\u00f3digo de WordPress como:<\/p>\n<pre><code class=\"language-php\">apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );<\/code><\/pre>\n<p>La cadena <strong><code>filter_name<\/code><\/strong> es el nombre del filtro, la variable <strong><code>value_to_be _filtered<\/code><\/strong> es el valor que debe ser filtrado y devuelto, y la variable <strong><code>[optional_arguments]<\/code><\/strong> puede pasar argumentos adicionales, al igual que con las acciones.<\/p>\n<p><strong>Ejemplo:<\/strong> El filtro <strong><code>apply_filters( 'admin_footer_text' , string $text )<\/code><\/strong> puede ser enganchado para modificar el texto que se muestra en el pie de p\u00e1gina del admin. A partir de WordPress 5.4, su valor predeterminado mostrar\u00e1 la frase<em> <code>Thank you for creating with<\/code><\/em> <a href=\"https:\/\/wordpress.org\" target=\"_blank\" rel=\"noopener noreferrer\"><em>WordPress<\/em><\/a><em>.<\/em> en el pie del \u00e1rea de administraci\u00f3n.<\/p>\n<p>Aprender\u00e1s a engancharte a las acciones y filtros m\u00e1s tarde con muchos ejemplos del n\u00facleo de WordPress.<\/p>\n<p>Una vez enganchado, puedes dirigir tu c\u00f3digo para <strong>hacer<\/strong> o <strong>personalizar<\/strong> algo en tu sitio. Por ejemplo, puedes utilizar ganchos para enviar un <a href=\"https:\/\/kinsta.com\/es\/blog\/email-marketing-mejores-practicas\/#email-marketing-platform\" target=\"_blank\" rel=\"noopener noreferrer\">correo electr\u00f3nico autom\u00e1tico<\/a> despu\u00e9s de publicar un mensaje, o cargar <a href=\"https:\/\/kinsta.com\/es\/blog\/temas-child-wordpress\/#the-files-in-a-wordpress-child-theme\" target=\"_blank\" rel=\"noopener noreferrer\">hojas de estilo personalizadas<\/a> para cambiar la apariencia de tu sitio.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/ganchos-de-wordpress-filtros-de-accion.png\" alt=\"Los ganchos de WordPress te ayudan a interactuar o modificar tu sitio web\" width=\"1100\" height=\"600\"><figcaption class=\"wp-caption-text\">Los ganchos de WordPress te ayudan a interactuar o modificar tu sitio web<\/figcaption><\/figure>\n<p>La forma m\u00e1s simple de entender los ganchos es imaginar que tu <a href=\"https:\/\/kinsta.com\/es\/blog\/ejemplos-de-sitios-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">sitio web de WordPress<\/a> est\u00e1 construyendo una casa.<\/p>\n<p>Los ganchos son similares a usar una gr\u00faa para mover objetos de construcci\u00f3n de un lado a otro. Los art\u00edculos que se transfieren son las <strong>funciones de callback<\/strong>\u00a0que incluyen tu <a href=\"https:\/\/kinsta.com\/es\/blog\/editar-codigo-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo personalizado<\/a>. Estos art\u00edculos (o funciones) pueden ayudarte a construir o modificar la casa.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/ejemplo-de-enganche.png\" alt=\"Ejemplo de enganche en la acci\u00f3n \"wp_head\" en WordPress\" width=\"1100\" height=\"636\"><figcaption class=\"wp-caption-text\">Ejemplo de enganche en la acci\u00f3n \u00abwp_head\u00bb en WordPress<\/figcaption><\/figure>\n<p>Las funciones de callback pueden ser funciones regulares de PHP, funciones predeterminadas de WordPress o funciones personalizadas definidas por t\u00ed.<\/p>\n<p>S\u00f3lo podemos llevar ciertos art\u00edculos en portadores espec\u00edficos unidos a ganchos particulares. Por lo tanto, las acciones s\u00f3lo pueden ser enganchadas con <strong>las funciones de acci\u00f3n.<\/strong> Del mismo modo, los filtros s\u00f3lo pueden ser enganchados con <strong>Funciones de Filtro<\/strong>.<\/p>\n<p>Mientras que es tedioso cambiar los ganchos y los portadores en una gr\u00faa, WordPress lo hace s\u00faper f\u00e1cil al incluir <a href=\"https:\/\/adambrown.info\/p\/wp_hooks\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e1s de 2.200 tipos de ganchos predeterminados<\/a>.<\/p>\n<figure style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/ganchos-nativos.png\" alt=\"WordPress 5.1 tiene m\u00e1s de 2200 ganchos nativos\" width=\"900\" height=\"357\"><figcaption class=\"wp-caption-text\">WordPress 5.1 tiene m\u00e1s de 2200 ganchos nativos (Fuente: Adam Brown)<\/figcaption><\/figure>\n<p>Puedes encontrar ganchos repartidos por el n\u00facleo de WordPress, lo que te permite acceder a la posici\u00f3n exacta en la que quieres engancharte y ejecutar tu c\u00f3digo personalizado.<\/p>\n\n<h2>Ganchos vs Acciones vs Filtros<\/h2>\n<p>Seg\u00fan el <a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/\" target=\"_blank\" rel=\"noopener noreferrer\">manual de plugins de WordPress<\/a>:<\/p>\n<blockquote><p>\u00ab<em>Los ganchos son una forma de que una pieza de c\u00f3digo interact\u00fae\/modifique otra pieza de c\u00f3digo&#8230; Hay dos tipos de ganchos: Acciones y Filtros.<\/em>\u201d<\/p><\/blockquote>\n<p>Hay una incoherencia generalizada en la forma en que se utilizan los t\u00e9rminos <strong>Gancho<\/strong>, <strong>Acci\u00f3n<\/strong> y <strong>Filtro<\/strong>. Algunos tutoriales y gu\u00edas los mezclan con las funciones asociadas a ellos. Una de las principales razones por las que existe esta confusi\u00f3n es por la compleja naturaleza del funcionamiento de los ganchos.<\/p>\n<p>Incluso si miras cuidadosamente dentro del n\u00facleo de WordPress, ver\u00e1s que no hay mucha diferencia entre a\u00f1adir acciones y filtros. Aqu\u00ed est\u00e1 el <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/plugin.php#L403\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo fuente de la funci\u00f3n add_action()<\/a> del archivo <strong><code>wp-includes\/plugin.php<\/code>:<\/strong><\/p>\n<pre><code class=\"language-php\">function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {\u00a0 \u00a0 \u00a0 \n    return add_filter( $tag, $function_to_add, $priority, $accepted_args );\n}<\/code><\/pre>\n<p>La funci\u00f3n <strong><code>add_action()<\/code><\/strong> s\u00f3lo llama a la funci\u00f3n <strong><code>add_filter()<\/code><\/strong> y devuelve su valor. \u00bfPor qu\u00e9? Porque ambas funcionan fundamentalmente de la misma manera, excepto por una diferencia.<\/p>\n<p>La funci\u00f3n <strong><code>apply_filters()<\/code><\/strong> devuelve un valor que puede cambiar los tipos de datos existentes, mientras que la funci\u00f3n <strong><code>do_action()<\/code> no devuelve<\/strong> nada (<a href=\"https:\/\/www.php.net\/manual\/en\/functions.returning-values.php\">valor NULL en PHP<\/a>).<\/p>\n<p>Si todav\u00eda est\u00e1s confundido, no te preocupes. Una vez que termines la primera mitad de este art\u00edculo, todo estar\u00e1 claro. Nos ce\u00f1iremos a la terminolog\u00eda oficial del Codex de WordPress ya que es clara, precisa y universal.<\/p>\n<p>Por ahora, familiar\u00edzate con la rutina del gancho que se muestra a continuaci\u00f3n.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/la-rutina-del-gancho.png\" alt=\"La rutina del gancho\" width=\"1100\" height=\"1161\"><figcaption class=\"wp-caption-text\">La rutina del gancho: Ganchos, funciones de gancho y funciones de callback<\/figcaption><\/figure>\n<p>Vamos a desglosar las diferencias entre Acciones y Ganchos.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align: center\" colspan=\"2\"><strong>Ganchos de WordPress<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><strong>Acciones<\/strong><\/td>\n<td style=\"text-align: center\"><strong>Filtros<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Las acciones se utilizan para ejecutar funciones personalizadas en un punto espec\u00edfico durante la ejecuci\u00f3n de WordPress Core.<\/td>\n<td>Los filtros se utilizan para modificar o personalizar los datos utilizados por otras funciones.<\/td>\n<\/tr>\n<tr>\n<td>Las acciones son definidas\/creadas por la funci\u00f3n <strong><code>do_action( 'action_name' )<\/code><\/strong> en el c\u00f3digo de WordPress.<\/td>\n<td>Los filtros son definidos\/creados por la funci\u00f3n <strong><code>apply_filters( 'filter_name', 'valu_to_be_filtered' )<\/code><\/strong> en el c\u00f3digo de WordPress.<\/td>\n<\/tr>\n<tr>\n<td>Las acciones tambi\u00e9n se llaman <strong>ganchos de acci\u00f3n<\/strong>.<\/td>\n<td>Los filtros tambi\u00e9n se llaman <strong>ganchos de filtro<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td>Las acciones s\u00f3lo se pueden enganchar con las funciones de acci\u00f3n. Por ejemplo, <strong><code>add_action()<\/code><\/strong>, <strong><code>remove_action()<\/code><\/strong>.<\/td>\n<td>Los filtros s\u00f3lo se pueden enganchar con las funciones de filtro. Por ejemplo, <strong><code>add_filter()<\/code><\/strong>, <strong><code>remove_filter()<\/code><\/strong>.<\/td>\n<\/tr>\n<tr>\n<td>Las funciones de acci\u00f3n no necesitan pasar ning\u00fan argumento a sus funciones de callback.<\/td>\n<td>Las funciones de filtro necesitan pasar al menos un argumento a sus funciones de callback.<\/td>\n<\/tr>\n<tr>\n<td>Las funciones de acci\u00f3n pueden realizar cualquier tipo de tarea, incluyendo cambiar el comportamiento de c\u00f3mo funciona WordPress.<\/td>\n<td>Las funciones de los filtros s\u00f3lo existen para modificar los datos que les pasan los filtros.<\/td>\n<\/tr>\n<tr>\n<td>Las funciones de acci\u00f3n no deber\u00edan <strong><code>return<\/code><\/strong> nada. Sin embargo, pueden hacer <strong><code>echo<\/code><\/strong> salida o interactuar con la base de datos.<\/td>\n<td>Las funciones del filtro deben <code><strong>return<\/strong><\/code> devolver sus cambios como salida. Aunque una funci\u00f3n de filtro no cambie nada, debe <code><strong>return<\/strong><\/code> la entrada no modificada.<\/td>\n<\/tr>\n<tr>\n<td>Las acciones pueden ejecutar casi cualquier cosa, siempre que el c\u00f3digo sea v\u00e1lido.<\/td>\n<td>Los filtros deben funcionar de manera aislada, para que no tengan efectos secundarios no deseados.<\/td>\n<\/tr>\n<tr>\n<td><strong>Resumen:<\/strong> Una acci\u00f3n interrumpe el proceso regular de ejecuci\u00f3n del c\u00f3digo para hacer algo con la informaci\u00f3n que recibe, pero no devuelve nada, y luego sale.<\/td>\n<td><strong>Resumen:<\/strong> Un filtro modifica la informaci\u00f3n que recibe, la devuelve a la funci\u00f3n de gancho de llamada, y otras funciones pueden usar el valor que devuelve.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A veces, se puede utilizar una acci\u00f3n o un filtro para lograr el mismo objetivo. Por ejemplo, si quieres modificar el texto de un post, puedes registrar una funci\u00f3n de callback con la acci\u00f3n <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/publish_post\" target=\"_blank\" rel=\"noopener noreferrer\">publish_post<\/a> y cambiar el contenido del post cuando se guarda en la <a href=\"https:\/\/kinsta.com\/es\/blog\/base-de-datos-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">base de datos<\/a>.<\/p>\n<pre><code class=\"language-php\">\/\/ define the callback function to change the text\nfunction change_text_callback() { \n    \/\/ add the code to change text here\n}\n\n\/\/ hook in to the 'publish_post' action with the add_action() function\nadd_action( 'publish_post', 'change_text_callback' );<\/code><\/pre>\n<p>O puedes registrar otra funci\u00f3n de callback con e <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/the_content\/\" target=\"_blank\" rel=\"noopener noreferrer\">content_filter<\/a> para modificar el contenido del mensaje antes de que se muestre en el navegador.<\/p>\n<pre><code class=\"language-php\">\/\/ define the callback function to modify the text\nfunction change_text_another_callback( $content ) { \n    \/\/ add the code to change text here and then return it \n    return $filtered_content;\n}\n\n\/\/ hook in to 'the_content' filter with the add_filter() function\nadd_filter( 'the_content', 'change_text_another_callback');<\/code><\/pre>\n<p>Dos enfoques diferentes con el mismo resultado. Saber cu\u00e1ndo usar uno sobre el otro es la clave para ser un <a href=\"https:\/\/kinsta.com\/es\/blog\/salario-desarrollador-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">buen desarrollador de WordPress<\/a>.<\/p>\n<h2>\u00bfC\u00f3mo funcionan los ganchos de WordPress?<\/h2>\n<p>El ejemplo de la casa era lo suficientemente simple como para entender el funcionamiento b\u00e1sico de los ganchos, pero no capta la complejidad de su funcionamiento. Lo m\u00e1s importante son los conceptos de posici\u00f3n y especificidad del gancho.<\/p>\n<p>Un mejor ejemplo ser\u00eda imaginar el procesamiento de una p\u00e1gina web de WordPress como el montaje de un coche. A diferencia de la fabricaci\u00f3n de un coche, que lleva tiempo, el montaje de una p\u00e1gina web es casi instant\u00e1neo.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/montar-una-pagina-web.png\" alt=\"Montar una p\u00e1gina web es como montar un coche\" width=\"1100\" height=\"1223\"><figcaption class=\"wp-caption-text\">Montar una p\u00e1gina web es como montar un coche<\/figcaption><\/figure>\n<p>Al igual que un coche se ensambla pieza por pieza en una l\u00ednea de montaje moderna, una p\u00e1gina web de WordPress se ensambla elemento por elemento por el servidor y el cliente.<\/p>\n<p>El n\u00facleo de WordPress es como el motor del coche, el chasis y otros elementos esenciales, que potencian la funcionalidad del \u00abn\u00facleo\u00bb del sitio web.<\/p>\n<p>Puedes tener un sitio web funcional s\u00f3lo con el n\u00facleo de WordPress, pero \u00bfd\u00f3nde est\u00e1 la diversi\u00f3n en eso? Necesitas agregar caracter\u00edsticas emocionantes al sitio. Ah\u00ed es donde intervienen <a href=\"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">los plugins<\/a> y <a href=\"https:\/\/kinsta.com\/es\/blog\/temas-wordpress-rapidos\/\" target=\"_blank\" rel=\"noopener noreferrer\">temas<\/a> de <a href=\"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a>, los cuales usan ganchos extensamente.<\/p>\n<p>En el ejemplo anterior, cada estaci\u00f3n numerada es como un gancho dentro del n\u00facleo de WordPress. Hay dos tipos de estaciones, como acciones y filtros. Cada estaci\u00f3n incluye un tipo espec\u00edfico de ranura que s\u00f3lo acepta ciertas herramientas, como las funciones de acci\u00f3n y las funciones de filtro.<\/p>\n<p>Todas las estaciones se colocan a intervalos frecuentes para mayor modularidad y eficiencia.<\/p>\n<p>Dependiendo de los requisitos de un puesto concreto, podemos acoplar (o enganchar) la herramienta m\u00e1s apropiada para el trabajo en esa estaci\u00f3n concreta. Estas herramientas son como las funciones de callback que se utilizan para interactuar o modificar WordPress.<\/p>\n<p>Algunas herramientas pueden alterar significativamente el funcionamiento del coche, como las llamadas registradas a las acciones. Otras herramientas s\u00f3lo se utilizan para personalizar el aspecto del coche, como las llamadas registradas a los filtros.<\/p>\n<p>Usar las herramientas correctas en las estaciones correctas es crucial para construir un coche de primera clase. De la misma manera, los ganchos nos ayudan a personalizar WordPress seg\u00fan nuestras necesidades \u00fanicas.<\/p>\n<p>Si extiendes esta analog\u00eda, los plugins son como a\u00f1adir \u00fatiles funciones de autom\u00f3vil como airbags, consola de entretenimiento, sistema remoto sin llaves, etc. (como estos para <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-de-woocommerce\/\" target=\"_blank\" rel=\"noopener noreferrer\">mejorar la funcionalidad de WooCommerce<\/a>). Los temas son an\u00e1logos a la personalizaci\u00f3n de la parte visual del coche, como el dise\u00f1o general, la pintura, las llantas, etc. (aqu\u00ed est\u00e1 c\u00f3mo <a href=\"https:\/\/kinsta.com\/es\/blog\/como-personalizar-tema-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">personalizar el tema<\/a> de <a href=\"https:\/\/kinsta.com\/es\/blog\/como-personalizar-tema-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a>).<\/p>\n<h2>\u00bfD\u00f3nde registrar los ganchos y sus funciones?<\/h2>\n<p>Hay dos formas recomendadas de a\u00f1adir ganchos en WordPress:<\/p>\n<ul>\n<li><strong>Plugins:<\/strong> Haz tu propio plugin y a\u00f1ade todo tu c\u00f3digo personalizado dentro de \u00e9l.<\/li>\n<li><strong>Temas de hijo:<\/strong> Registra las funciones de enganche y callback en <a href=\"https:\/\/kinsta.com\/es\/blog\/temas-child-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">el archivo <strong><code>functions.php<\/code><\/strong> del tema hijo<\/a>.<\/li>\n<\/ul>\n<p>Para este tutorial, empecemos por crear un plugin. Para ello, crea una nueva carpeta en tu directorio <strong><code>\/wp-content\/plugins\/<\/code><\/strong>.<\/p>\n<p>Estoy nombrando a mi plugin <strong><code>salhooks<\/code><\/strong>, pero puedes nombrarlo como quieras. Seg\u00fan las directrices de WordPress, debes crear un archivo PHP con el mismo nombre (<strong><code>salhooks.php<\/code><\/strong>) dentro del directorio de tu plugin.<\/p>\n<p>A\u00f1ade los siguientes campos de encabezado a tu archivo de plugin para registrarlo con WordPress. Puedes obtener m\u00e1s informaci\u00f3n sobre los <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/\" target=\"_blank\" rel=\"noopener noreferrer\">requisitos de encabezado de los plugins<\/a> en el Codex de WordPress.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name:  Salhooks\nVersion    :  1.0\nDescription:  Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.\nAuthor     :  Salman Ravoof\nAuthor URI :  https:\/\/www.salmanravoof.com\/\nLicense    :  GPLv2 or later\nLicense URI:  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain:  salhooks\n*\/\n\n\/\/=================================================\n\/\/ Security: Abort if this file is called directly\n\/\/=================================================\nif ( !defined('ABSPATH') ) { \n    die;\n}<\/code><\/pre>\n<p>Guarda este archivo y luego activa el plugin en tu <a href=\"https:\/\/kinsta.com\/es\/blog\/panel-control-administracion-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">panel de control de WordPress<\/a>. Usar\u00e9 este plugin dentro de una <a href=\"https:\/\/kinsta.com\/es\/blog\/instalar-wordpress-localmente\/\" target=\"_blank\" rel=\"noopener noreferrer\">instalaci\u00f3n local de WordPress<\/a> para demostrar c\u00f3mo funcionan los ganchos.<\/p>\n<p>Como nota al margen, tambi\u00e9n puedes editar los archivos de WordPress Core directamente para registrar los ganchos. Sin embargo, no es recomendable ya que todo tu c\u00f3digo personalizado ser\u00e1 sobrescrito cada vez <a href=\"https:\/\/kinsta.com\/es\/blog\/actualizaciones-automaticas-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">que actualices WordPress<\/a>. No deber\u00edas a\u00f1adir ganchos dentro del tema principal por la misma raz\u00f3n.<\/p>\n<h2>Usando ganchos de WordPress<\/h2>\n<p>Un gancho de WordPress por s\u00ed solo no hace nada. S\u00f3lo se sienta en el c\u00f3digo, esperando que alguna funci\u00f3n de gancho lo active. Para hacer uso de un gancho, necesitas llamar al menos a otras 2 funciones.<\/p>\n<p>Primero, tienes que registrar el gancho con una funci\u00f3n de gancho y referirte a una funci\u00f3n de callback dentro de \u00e9l. Y luego necesitas definir la funci\u00f3n de callback que mencionaste anteriormente en la funci\u00f3n de gancho. WordPress ejecutar\u00e1 esta funci\u00f3n callback cada vez que el gancho sea disparado.<\/p>\n<p>El orden en el que se definen estas funciones no importa, pero es una buena idea colocarlas muy juntas.<\/p>\n<p>Las acciones y los filtros tienen distintas funciones de gancho. A partir de ahora, nos referiremos a ellas como <strong>Funciones de Acci\u00f3n<\/strong> y <strong>Funciones de Filtro<\/strong>. Como ver\u00e1s, tienen sus propios requisitos de sintaxis y par\u00e1metros.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Enganchar una acci\u00f3n<\/h3>\n<p>Las acciones proporcionan una forma de ejecutar tu c\u00f3digo personalizado en un punto determinado de la ejecuci\u00f3n de WordPress Core, plugins o temas.<\/p>\n<h4>La funci\u00f3n de acci\u00f3n add_action()<\/h4>\n<p>Puedes registrar una funci\u00f3n de callback con una acci\u00f3n siguiendo estos pasos:<\/p>\n<ol>\n<li>Define una <strong>funci\u00f3n de callback<\/strong> con tu c\u00f3digo personalizado dentro de ella. Esta funci\u00f3n de callback se ejecutar\u00e1 cuando cualquier acci\u00f3n registrada se dispare durante la ejecuci\u00f3n del c\u00f3digo de WordPress.<\/li>\n<li>Engancha tu funci\u00f3n de callback a la acci\u00f3n que quieras con la funci\u00f3n <strong><code>add_action()<\/code><\/strong>. Seg\u00fan el Codex de WordPress, la funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\" target=\"_blank\" rel=\"noopener noreferrer\">add_action()<\/a> necesita pasar al menos dos par\u00e1metros:\n<ol>\n<li>Nombre de la acci\u00f3n a la que se engancha.<\/li>\n<li>Nombre de la funci\u00f3n de callback que se ejecutar\u00e1 cuando se active la acci\u00f3n.<\/li>\n<\/ol>\n<\/li>\n<li>La funci\u00f3n <strong><code>add_action()<\/code><\/strong> tambi\u00e9n acepta dos par\u00e1metros opcionales para establecer la <code><strong>priority<\/strong><\/code> y el <strong><code>mumber of arguments<\/code><\/strong>. Discutiremos ambos m\u00e1s tarde.<\/li>\n<\/ol>\n<p>Es una buena pr\u00e1ctica nombrar los par\u00e1metros de la funci\u00f3n de callback lo m\u00e1s cerca posible de los par\u00e1metros pasados por la funci\u00f3n de gancho.<br \/>\nVeamos un ejemplo de uso de la funci\u00f3n <strong><code>add_action()<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">\/\/ define the callback function, the arguments are optional\nfunction example_callback( $arg1, $arg2 ) {\n\u00a0 \u00a0 \/\/ make your code do something with the arguments\n}\n\n\/\/ hook the callback function to the 'example_action'\nadd_action( 'example_action', 'example_callback', [priority], [no_of_args] );\n\n\/\/ 'priority' and 'number of arguments' are optional parameters<\/code><\/pre>\n<h4>Ejemplo de enganche de una acci\u00f3n<\/h4>\n<p>WordPress incluye una acci\u00f3n incorporada llamada <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/init\/\">init<\/a> que se dispara despu\u00e9s de que WordPress ha terminado de cargar y autentificar al usuario, pero antes de que se env\u00ede cualquier encabezado. Muchos plugins usan este gancho como punto de partida para instanciar su c\u00f3digo ya que casi todas las principales caracter\u00edsticas de WordPress han terminado de cargarse en el momento en que WordPress ejecuta esta acci\u00f3n.<\/p>\n<p>WordPress tiene una acci\u00f3n similar llamada <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_init\/\" target=\"_blank\" rel=\"noopener noreferrer\">admin_init<\/a>. Se dispara mientras la pantalla de administraci\u00f3n se est\u00e1 inicializando, mientras que la acci\u00f3n <strong>init<\/strong> se dispara s\u00f3lo despu\u00e9s de que WordPress ha terminado de cargar.<\/p>\n<p>Vamos a ejecutar un c\u00f3digo personalizado para hacer <strong>eco <\/strong>de un simple mensaje durante la ejecuci\u00f3n de la acci\u00f3n <strong>init<\/strong>. As\u00ed es como se hace:<\/p>\n<pre><code class=\"language-php\">function custom_callback_function(){\n\u00a0 \u00a0 \/\/ add your custom code here to do something\n\u00a0 \u00a0 echo 'I will be fired on WordPress initialization';\n}\nadd_action( 'init', 'custom_callback_function' );<\/code><\/pre>\n<p>Puedes ver el mensaje que se repite en la esquina superior izquierda de mi <a href=\"https:\/\/kinsta.com\/es\/blog\/instalar-wordpress-localmente\/\" target=\"_blank\" rel=\"noopener noreferrer\">instalaci\u00f3n local de WordPress<\/a>.<\/p>\n<figure id=\"attachment_72244\" aria-describedby=\"caption-attachment-72244\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72244 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/init-action-hook-ejemplo.jpg\" alt=\"No es tan bonito, pero es un gran comienzo.\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72244\" class=\"wp-caption-text\">No es tan bonito, pero es un gran comienzo.<\/figcaption><\/figure>\n<h4>Encontrar acciones apoyadas por WordPress<\/h4>\n<p>WordPress incluye acciones cada vez que hace algo, como que un <a href=\"https:\/\/kinsta.com\/es\/blog\/encontrar-wordpress-url\/\" target=\"_blank\" rel=\"noopener noreferrer\">usuario se conecte<\/a> o <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-missed-schedule\/\" target=\"_blank\" rel=\"noopener noreferrer\">publique un nuevo post<\/a>. Puedes encontrar una lista completa de todas las acciones ejecutadas por WordPress en la p\u00e1gina <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\" target=\"_blank\" rel=\"noopener noreferrer\">Referencia de la API\/Acci\u00f3n del Plugin<\/a>.<\/p>\n<figure id=\"attachment_72247\" aria-describedby=\"caption-attachment-72247\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72247 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/hay-una-accion-para-casi-todos-los-usos.png\" alt=\"Hay una acci\u00f3n para casi todos los usos\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72247\" class=\"wp-caption-text\">Hay una acci\u00f3n para casi todos los usos<\/figcaption><\/figure>\n<p>El Codex ha dividido todas las acciones enumeradas all\u00ed en varias categor\u00edas y las ha ordenado del primero al \u00faltimo en el orden de ejecuci\u00f3n de WordPress.<\/p>\n<p>En la mayor\u00eda de los casos, muchas de estas acciones no har\u00e1n nada ya que nada est\u00e1 enganchado a ellas. Pero si las necesitas, est\u00e1n ah\u00ed para que te enganches a ellas.<\/p>\n<p>\u00bfTe sientes un poco abrumado con todas las acciones? Es natural. A medida que adquieras m\u00e1s experiencia y revises el c\u00f3digo fuente del n\u00facleo de WordPress, ser\u00e1 m\u00e1s f\u00e1cil encontrar el gancho perfecto para tus necesidades. S\u00f3lo realiza una b\u00fasqueda del t\u00e9rmino \u00ab<strong>do_action<\/strong>\u00bb y encontrar\u00e1s un mont\u00f3n de acciones en las que puedes engancharte.<\/p>\n<h4>Par\u00e1metros adicionales para add_action()<\/h4>\n<p>La funci\u00f3n <strong><code>add_action()<\/code><\/strong> puede aceptar dos par\u00e1metros m\u00e1s: uno para establecer la <strong><code>priority<\/code><\/strong>y el otro para establecer el <strong><code>number of arguments<\/code><\/strong>. Aunque son opcionales, si se usan correctamente, pueden ser muy \u00fatiles.<\/p>\n<h5>Prioridad<\/h5>\n<p>El primer par\u00e1metro adicional soportado por la funci\u00f3n <strong><code>add_action()<\/code><\/strong> establece\u00a0 <strong><code>priority<\/code><\/strong>. Este par\u00e1metro s\u00f3lo puede ser un entero positivo. Cuanto menor sea el n\u00famero de prioridad, antes se ejecutar\u00e1 la funci\u00f3n. Su valor predeterminado es 10 si no lo especificas.<\/p>\n<p>Para ver c\u00f3mo funciona, registremos tres funciones de callback a la acci\u00f3n <strong><code>init<\/code><\/strong>, pero cada una con diferentes prioridades.<\/p>\n<pre><code class=\"language-php\">\/\/ priority is set to 9, which is lower than 10, hence it ranks higher\nadd_action( 'init', 'i_am_high_priority', 9 );\n\n\/\/ if no priority is set, the default value of 10 will be used\nadd_action( 'init', 'i_am_default_priority');\n\n\/\/ priority is set to 11, which is higher than 11, hence it ranks lower\nadd_action( 'init', 'i_am_low_priority', 11 );<\/code><\/pre>\n<p>En los ejemplos anteriores, la funci\u00f3n de callback con el n\u00famero de menor prioridad se ejecutar\u00e1 primero y la de mayor n\u00famero se ejecutar\u00e1 en \u00faltimo lugar. Si sus prioridades son las mismas, entonces se ejecutar\u00e1n en el orden en que se registren.<\/p>\n<p>La prioridad juega un papel importante cuando un solo gancho puede tener registradas m\u00faltiples funciones de callback. Para evitar resultados inesperados, puedes establecer una prioridad para cada funci\u00f3n de callback, para que se disparen en el orden que desees.<\/p>\n<h5>N\u00famero de argumentos<\/h5>\n<p>Por defecto, cualquier funci\u00f3n de callback registrada a trav\u00e9s de la funci\u00f3n <strong><code>add_action()<\/code><\/strong> recibir\u00e1 s\u00f3lo un argumento. Sin embargo, a veces puede ser necesario pasar datos adicionales a la funci\u00f3n callback.<\/p>\n<p>Por esta raz\u00f3n la funci\u00f3n <strong><code>add_action()<\/code><\/strong> acepta un par\u00e1metro opcional para establecer el n\u00famero de argumentos.<\/p>\n<p>Un gran ejemplo para mostrar esto es la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_post\/\" target=\"_blank\" rel=\"noopener noreferrer\">comment_post<\/a>. Esta acci\u00f3n se ejecuta inmediatamente despu\u00e9s de que <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-comentarios-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress a\u00f1ade un comentario a la base de datos<\/a>. Si no se establece el par\u00e1metro de <strong><code>number of arguments<\/code><\/strong>, pasar\u00e1 s\u00f3lo un valor a la funci\u00f3n de callback, que en este caso ser\u00e1 el <strong><code>comment_ID<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">\/\/ register the hook with 'priority' and 'number of arguments' parameters\nadd_action( 'comment_post', 'show_message_function', 10, 3 );\n\n\/\/ define the callback function\nfunction show_message_function( $comment_ID, $comment_approved, $commentdata ) {\n\u00a0 \u00a0 \/\/ check whether a comment is approved with the second parameter\n\u00a0 \u00a0 if( 1 === $comment_approved ){\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ runs the code only if the comment is approved\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>Si se establece el par\u00e1metro de <strong>n\u00famero de argumentos<\/strong> en <strong>3<\/strong> como en el ejemplo anterior, la funci\u00f3n de acci\u00f3n pasar\u00e1 tres valores: <strong><code>comment_ID<\/code><\/strong>, <strong><code>comment_approved<\/code><\/strong>, y <strong><code>commentdata<\/code><\/strong>.<\/p>\n<p>WordPress establece el valor <strong><code>comment_approved<\/code><\/strong> en <strong>1<\/strong> para los comentarios aprobados, en <strong>0<\/strong> si no est\u00e1n aprobados y en \u00ab<a href=\"https:\/\/kinsta.com\/es\/blog\/comentarios-spam-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">spam<\/a>\u00bb si el <a href=\"https:\/\/kinsta.com\/es\/blog\/comentarios-spam-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">comentario est\u00e1 marcado como tal<\/a>.<\/p>\n<p>La variable <strong><code>commentdata<\/code><\/strong> es una matriz que incluye todos los datos del comentario, como el nombre del autor del comentario, la direcci\u00f3n de correo electr\u00f3nico, el sitio web y el contenido del propio comentario. Puedes revisar el Codex de WordPress para encontrar todos los <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_new_comment\/#parameters\" target=\"_blank\" rel=\"noopener noreferrer\">pares clave-valor incluidos en la matriz de \u00abcommentdata\u00bb<\/a>.<\/p>\n<p>Puedes tener tantos argumentos como quieras, pero la funci\u00f3n callback y la funci\u00f3n <strong><code>add_action()<\/code><\/strong> necesitan especificar el mismo n\u00famero de argumentos.<\/p>\n<p>Pasando par\u00e1metros adicionales a la funci\u00f3n de callback, puedes hacer m\u00e1s con tu c\u00f3digo. Por ejemplo, puedes comprobar si un comentario est\u00e1 aprobado o no y <a href=\"https:\/\/kinsta.com\/es\/blog\/comentarios-spam-wordpress\/#3-enable-comment-moderation\" target=\"_blank\" rel=\"noopener noreferrer\">enviar autom\u00e1ticamente el texto del comentario al administrador si est\u00e1 aprobado<\/a>. No es posible hacerlo sin especificar los argumentos adicionales, ya que la funci\u00f3n de callback no tendr\u00e1 acceso a los datos de <strong><code>comment_content<\/code><\/strong>.<\/p>\n<p>Si no quieres establecer la prioridad, pero s\u00f3lo quieres cambiar el n\u00famero de argumentos, todav\u00eda tienes que establecer una prioridad. S\u00f3lo tienes que usar su valor por defecto (es decir, 10).<\/p>\n<h4>\u00bfC\u00f3mo el n\u00facleo de WordPress utiliza las acciones?<\/h4>\n<p>El propio WordPress Core utiliza muchas de sus acciones incorporadas para realizar varias funciones.<\/p>\n<p>Tomemos la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/wp_head\/\" target=\"_blank\" rel=\"noopener noreferrer\">wp_head<\/a> por ejemplo. Se dispara cuando WordPress produce la secci\u00f3n de encabezado de las p\u00e1ginas web (el c\u00f3digo que va entre <strong><code>&lt;head&gt; y &lt;\/head&gt;<\/code> ).<\/strong><\/p>\n<p>Puedes encontrar la mayor\u00eda de las funciones de acci\u00f3n de WordPress Core relacionadas con el gancho <strong><code>wp_head<\/code><\/strong> en el archivo <strong><code>wp-includes\/default-filters.php<\/code><\/strong>. He <a href=\"https:\/\/github.com\/WordPress\/WordPress\/blob\/master\/wp-includes\/default-filters.php\" target=\"_blank\" rel=\"noopener noreferrer\">revisado el c\u00f3digo<\/a> y compilado una lista de todas las funciones <strong><code>add_action()<\/code><\/strong> que invocan la acci\u00f3n <strong><code>wp_head<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );\nadd_action( 'wp_head', '_wp_render_title_tag', 1 );\nadd_action( 'wp_head', 'wp_enqueue_scripts', 1 );\nadd_action( 'wp_head', 'wp_resource_hints', 2 );\nadd_action( 'wp_head', 'feed_links', 2 );\nadd_action( 'wp_head', 'feed_links_extra', 3 );\nadd_action( 'wp_head', 'rsd_link' );\nadd_action( 'wp_head', 'wlwmanifest_link' );\nadd_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );\nadd_action( 'wp_head', 'locale_stylesheet' );\nadd_action( 'wp_head', 'noindex', 1 );\nadd_action( 'wp_head', 'print_emoji_detection_script', 7 );\nadd_action( 'wp_head', 'wp_print_styles', 8 );\nadd_action( 'wp_head', 'wp_print_head_scripts', 9 );\nadd_action( 'wp_head', 'wp_generator' );\nadd_action( 'wp_head', 'rel_canonical' );\nadd_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );\nadd_action( 'wp_head', 'wp_custom_css_cb', 101 );\nadd_action( 'wp_head', 'wp_site_icon', 99 );\nadd_action( 'wp_head', 'wp_no_robots' );<\/code><\/pre>\n<p>Son muchas funciones de callback enganchadas a una sola acci\u00f3n. Establecer <strong><code>priority<\/code><\/strong>aqu\u00ed es crucial para asegurar que las funciones enganchadas m\u00e1s importantes funcionen primero.<\/p>\n<p>En el ejemplo anterior, la carga de los scripts con la funci\u00f3n de callback <strong><code>wp_enqueue_scripts()<\/code><\/strong> es m\u00e1s importante (prioridad = 1) que la carga de las metaetiquetas del icono del sitio con la funci\u00f3n de callback <strong><code>wp_site_icon()<\/code><\/strong> (prioridad = 99).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Todas las funciones de callback utilizadas en el ejemplo anterior son funciones de WordPress. Tambi\u00e9n puedes usarlas en cualquiera de tus c\u00f3digos. Visita la <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de referencia de funciones en el Codex de WordPress<\/a> para m\u00e1s informaci\u00f3n.<\/p>\n<\/aside>\n\n<h4>Otras funciones de acci\u00f3n<\/h4>\n<p>Mientras que <strong><code>add_action()<\/code><\/strong> es la funci\u00f3n de acci\u00f3n m\u00e1s utilizada, hay muchas otras que son igualmente \u00fatiles. Veamos c\u00f3mo funcionan todas ellas.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/has_action\">has_action()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de acci\u00f3n comprueba si una acci\u00f3n ha sido enganchada. Acepta dos par\u00e1metros. El primero es el nombre de la acci\u00f3n. El segundo par\u00e1metro es opcional y es el nombre de la funci\u00f3n de callback.<\/p>\n<pre><code class=\"language-php\">has_action( 'action_name', 'function_to_check' );<\/code><\/pre>\n<p>Si se especifica s\u00f3lo el primer par\u00e1metro, devuelve <strong><code>true<\/code><\/strong> si <em>alguna<\/em> funci\u00f3n est\u00e1 enganchada al par\u00e1metro <strong><code>action_name<\/code><\/strong>.<\/p>\n<p>Pero si tambi\u00e9n especifica el segundo par\u00e1metro, devolver\u00e1 <strong><code>false<\/code><\/strong> si la funci\u00f3n de callback especificada no est\u00e1 registrada en la acci\u00f3n mencionada.<\/p>\n<p>Sin embargo, si encuentra la funci\u00f3n de callback conectada al gancho de acci\u00f3n, devolver\u00e1 <strong><code>priority<\/code><\/strong> (un entero) establecida para esa funci\u00f3n en este gancho de acci\u00f3n.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\">do_action()<\/a><\/li>\n<\/ul>\n<p>Ya nos hemos encontrado con esta funci\u00f3n de acci\u00f3n antes. WordPress la usa para definir todas sus acciones predeterminadas, permitiendo que otras funciones se enganchen a ellas. Al igual que WordPress, tambi\u00e9n puede utilizar la funci\u00f3n <strong><code>do_action()<\/code><\/strong> para crear una nueva acci\u00f3n personalizada especificando un nuevo nombre de acci\u00f3n como par\u00e1metro.<\/p>\n<pre><code class=\"language-php\">do_action( 'action_name', [argument1], [argument2] );<\/code><\/pre>\n<p>El simple hecho de declarar esta funci\u00f3n no har\u00e1 nada por s\u00ed mismo. Pero se sentar\u00e1 en el c\u00f3digo, esperando que otras funciones de acci\u00f3n lo activen. Pasar cualquier argumento extra es opcional, pero es importante si quieres que tus funciones de callback las usen.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/do_action_ref_array\">do_action_ref_array()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de acci\u00f3n es id\u00e9ntica a <strong><code>do_action()<\/code><\/strong>, excepto por una diferencia. Cualquier argumento que se pase por ella debe ser un array. Cuando tienes muchos argumentos que pasar o tus argumentos ya est\u00e1n en un array, esta funci\u00f3n es super \u00fatil.<\/p>\n<pre><code class=\"language-php\">\/\/ here's an example array\n$arguments_array = array( 'arg_1', 'foo', true, 'arg_4' );\n\ndo_action_ref_array( 'example_action', $arguments_array );<\/code><\/pre>\n<p>Ya que las matrices PHP son un mapa ordenado, aseg\u00farate de que los argumentos que pases est\u00e9n en el orden correcto.<\/p>\n<p>Un ejemplo del uso de esta funci\u00f3n de acci\u00f3n es la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_bar_menu\/\" target=\"_blank\" rel=\"noopener noreferrer\">admin_bar_menu<\/a>. Puede ser enganchada para a\u00f1adir, manipular o eliminar los diferentes elementos de la barra de administraci\u00f3n. Todos los elementos de la barra de administraci\u00f3n se definen como elementos de un array.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/did_action\">did_action()<\/a><\/li>\n<\/ul>\n<p>Si quieres contar el n\u00famero de veces que se dispara una acci\u00f3n, puede invocar esta funci\u00f3n de acci\u00f3n.<\/p>\n<pre><code class=\"language-php\">did_action( 'action_name' );<\/code><\/pre>\n<p>Esta funci\u00f3n devuelve un valor entero.<\/p>\n<p>La funci\u00f3n <strong><code>did_action()<\/code><\/strong> es extremadamente \u00fatil cuando se quiere ejecutar una funci\u00f3n de callback s\u00f3lo la primera vez que se ejecuta una acci\u00f3n y nunca m\u00e1s.<\/p>\n<pre><code class=\"language-php\">function example_callback_function() {\n    if( did_action( 'example_action' ) === 1 ) {\n    \/\/ checks if the 'example_action' hook is fired once, and only runs then, and never again!\n    }\n}\nadd_action('example_action', 'example_callback_function');<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_action\">remove_action()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de acci\u00f3n elimina una funci\u00f3n de callback enganchada a la acci\u00f3n especificada. Por ejemplo, puede utilizar esta funci\u00f3n para eliminar las funciones predeterminadas de WordPress enganchadas a las acciones incorporadas y sustituirlas por las suyas propias.<\/p>\n<pre><code class=\"language-php\">remove_action( 'action_name', 'function_to_be_removed', [priority] );<\/code><\/pre>\n<p>Hay algunos requisitos previos para llamar a la funci\u00f3n <strong><code>remove_action()<\/code><\/strong>:<\/p>\n<ol>\n<li>Los par\u00e1metros de <strong><code>function_to_be_removed<\/code><\/strong> y <strong><code>priority<\/code><\/strong>deben ser los mismos que los usados originalmente en la funci\u00f3n <strong><code>add_action()<\/code><\/strong>.<\/li>\n<li>No se puede llamar directamente a la funci\u00f3n <strong><code>remove_action()<\/code><\/strong>. Necesitas llamarla de otra funci\u00f3n.<\/li>\n<li>Si la funci\u00f3n de callback se registra de una <em>clase<\/em>, entonces la eliminaci\u00f3n de la misma tiene otros requisitos. Puedes consultar la documentaci\u00f3n del Codex de WordPress para obtener m\u00e1s detalles.<\/li>\n<li>No puedes eliminar la funci\u00f3n de callback antes de que se registre o despu\u00e9s de que se ejecute.<\/li>\n<\/ol>\n<p>Aqu\u00ed hay un ejemplo de c\u00f3mo <a href=\"https:\/\/kinsta.com\/es\/blog\/tutorial-de-woocommerce\/\" target=\"_blank\" rel=\"noopener noreferrer\">WooCommerce<\/a> utiliza esta funci\u00f3n de acci\u00f3n para eliminar la miniatura del producto por defecto en la p\u00e1gina principal de la tienda.<\/p>\n<pre><code class=\"language-php\">remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_all_actions\">remove_all_actions()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de acci\u00f3n elimina todo lo que se engancha a una acci\u00f3n. El par\u00e1metro de prioridad es opcional.<\/p>\n<pre><code class=\"language-php\">remove_all_actions( 'action_name', [priority] );<\/code><\/pre>\n<p>Recuerda que esta funci\u00f3n no puede ser llamada desde la acci\u00f3n de la que deseas desregistrar las funciones de callback. Eso causar\u00eda un bucle infinito. Puedes engancharte a una acci\u00f3n que se haya disparado antes para ejecutar esta funci\u00f3n sin errores.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/doing_action\/\">doing_action()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de acci\u00f3n comprueba si la acci\u00f3n especificada se est\u00e1 ejecutando o no. Devuelve un valor booleano (<strong><code>true<\/code><\/strong> o <strong><code>false<\/code><\/strong>).<\/p>\n<pre><code class=\"language-php\">\/\/ check whether the 'action_name' action is being executed\nif ( doing_action( 'action_name' ) ) {\n\u00a0 \u00a0 \/\/ execute your code here\n}<\/code><\/pre>\n<p>Puedes dejar el par\u00e1metro <strong><code>action_name<\/code><\/strong> vac\u00edo para comprobar si se est\u00e1 ejecutando<em> alguna<\/em> acci\u00f3n. Devolver\u00e1 <strong><code>true<\/code><\/strong> cada vez que se dispare cualquier acci\u00f3n.<\/p>\n<pre><code class=\"language-php\">\/\/ check if any action is running and do something\nif ( doing_action() ) {\n  \u00a0 \/\/ the code here is run when any action is fired\n}<\/code><\/pre>\n<h4>Acciones Ejemplo 1: Mostrar un mensaje de mantenimiento a los visitantes de tu sitio<\/h4>\n<p>A veces, es mejor desconectar la p\u00e1gina web y poner una <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-modo-de-mantenimiento\/\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de mantenimiento<\/a>. Afortunadamente, WordPress proporciona una manera f\u00e1cil de hacer eso.<\/p>\n<pre><code class=\"language-php\">\/\/ show a maintenance message for all your site visitors\nadd_action( 'get_header', 'maintenance_message' );\nfunction maintenance_message() {\n    if (current_user_can( 'edit_posts' )) return;\n    wp_die( '&lt;h1&gt;Stay Pawsitive!&lt;\/h1&gt;&lt;br&gt;Sorry, we\\'re temporarily down for maintenance right meow.' );\n}<\/code><\/pre>\n<p>Desglosemos el c\u00f3digo y repasemos cada paso:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/get_header\/\" target=\"_blank\" rel=\"noopener noreferrer\">get_header<\/a> es una acci\u00f3n que se dispara antes de que se cargue el archivo de la plantilla de cabecera del sitio. Es una acci\u00f3n perfecta para enganchar si quieres interrumpir la carga del sitio principal.<\/li>\n<li>Engancha la acci\u00f3n <strong><code>get_header<\/code><\/strong> con la funci\u00f3n <strong><code>add_action()<\/code><\/strong> con la funci\u00f3n callback <strong><code>maintenance_message()<\/code><\/strong>.<\/li>\n<li>Definir la funci\u00f3n de callback <strong><code>maintenance_message()<\/code><\/strong>.<\/li>\n<li><strong><code>current_user_can( 'edit_posts' )<\/code><\/strong> es una <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/current_user_can\/\" target=\"_blank\" rel=\"noopener noreferrer\">funci\u00f3n de prueba de capacidad de usuario<\/a> que comprueba si el usuario actual est\u00e1 conectado y <a href=\"https:\/\/wordpress.org\/support\/article\/roles-and-capabilities\/#edit_posts\" target=\"_blank\" rel=\"noopener noreferrer\">puede editar los mensajes<\/a>. <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-registro-usuario-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">Todos los usuarios registrados en un sitio de WordPress,<\/a> excepto aquellos con roles de suscriptor, tienen la capacidad de editar mensajes. Hay otras maneras robustas de realizar esta comprobaci\u00f3n, pero nos ce\u00f1iremos a este sencillo m\u00e9todo aqu\u00ed.<\/li>\n<li>Utiliza la funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_die\/\" target=\"_blank\" rel=\"noopener noreferrer\">wp_die()<\/a> predeterminada para detener la ejecuci\u00f3n de WordPress con gracia y mostrar una p\u00e1gina HTML con un mensaje de error. Puede utilizar la sintaxis HTML en el par\u00e1metro del mensaje de error para darle formato.<\/li>\n<\/ul>\n<p>Despu\u00e9s de guardar el c\u00f3digo en mi plugin personalizado, cargu\u00e9 mi instalaci\u00f3n local de WordPress en modo de navegaci\u00f3n privada. La p\u00e1gina <strong>de mantenimiento<\/strong> es un \u00e9xito!<\/p>\n<figure id=\"attachment_72274\" aria-describedby=\"caption-attachment-72274\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72274 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-mensaje-de-error.png\" alt=\"Mostrando un mensaje de error a los visitantes del sitio\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72274\" class=\"wp-caption-text\">Mostrando un mensaje de error a los visitantes del sitio<\/figcaption><\/figure>\n<p>El sitio se carga con \u00e9xito si estoy conectado y pasa la prueba de capacidad de usuario. Ahora puedes continuar trabajando en la reparaci\u00f3n de tu sitio mientras muestra a los visitantes regulares esta p\u00e1gina.<\/p>\n<h4>Acciones Ejemplo 2: Ocultar los elementos del men\u00fa del tablero de mandos a los usuarios que no son administradores<\/h4>\n<p>Si tienes un <a href=\"https:\/\/kinsta.com\/es\/blog\/como-cambiar-autor-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">blog de varios autores<\/a> o administras <a href=\"https:\/\/kinsta.com\/es\/blog\/mantenimiento-de-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">un sitio para tus clientes<\/a>, es posible que tengas que ocultar ciertos men\u00fas de administraci\u00f3n del <a href=\"https:\/\/kinsta.com\/es\/blog\/panel-control-administracion-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">panel de control de WordPress<\/a> para los usuarios que no son administradores. Puedes hacerlo enganch\u00e1ndote a la acci\u00f3n <strong><code>admin_menu<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">\/\/ remove specific dashboard menus for non-admin users\nadd_action( 'admin_menu', 'hide_admin_menus' );\nfunction hide_admin_menus() {\n    if (current_user_can( 'create_users' )) return;\n    if (wp_get_current_user()-&gt;display_name == \"Salman\") return; \n    remove_menu_page( 'plugins.php' ); \n    remove_menu_page( 'themes.php' ); \n    remove_menu_page( 'tools.php' ); \n    remove_menu_page( 'users.php' ); \n    remove_menu_page( 'edit.php?post_type=page' ); \n    remove_menu_page( 'options-general.php' );\n}<\/code><\/pre>\n<p>Aqu\u00ed hay un paseo paso a paso por el fragmento de c\u00f3digo de arriba:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_menu\/\" target=\"_blank\" rel=\"noopener noreferrer\">admin_menu<\/a> es una acci\u00f3n que se activa antes de que el men\u00fa de administraci\u00f3n se cargue en el \u00e1rea del tablero de WordPress.<\/li>\n<li>Engancharse a la acci\u00f3n del <strong><code><code>admin_menu<\/code><\/code><\/strong> usando la funci\u00f3n <strong><code>add_action()<\/code><\/strong> usando la funci\u00f3n callback <strong><code>hide_admin_menus()<\/code><\/strong>.<\/li>\n<li>La funci\u00f3n callback de <strong><code>hide_admin_menus()<\/code><\/strong> define la l\u00f3gica del c\u00f3digo. Se ejecuta cada vez que se dispara la acci\u00f3n <strong><code>admin_menu<\/code><\/strong>.<\/li>\n<li>Dentro de la funci\u00f3n de devoluci\u00f3n de llamada, la funci\u00f3n <strong><code>current_user_can( 'create_users' )<\/code><\/strong> comprueba si el usuario conectado es un administrador. Dado que s\u00f3lo los administradores del sitio tienen la capacidad de <strong><code>create_user<\/code><\/strong>, la funci\u00f3n termina con una declaraci\u00f3n <strong>de retorno<\/strong> si el usuario es un administrador.<\/li>\n<li>La funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_current_user\/\" target=\"_blank\" rel=\"noopener noreferrer\">wp_get_current_user()<\/a> WordPress recupera el objeto de usuario actual. Con esta funci\u00f3n, podemos comprobar si el usuario conectado tiene un conjunto de nombres de <strong><code>display_name<\/code><\/strong> determinado. Esta es una l\u00ednea opcional, en caso de que se quiera omitir a ciertos usuarios no administradores para que no sean bloqueados debido a esta funci\u00f3n de devoluci\u00f3n de llamada.<\/li>\n<li>La funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_menu_page\/\">remove_menu_page()<\/a> de WordPress elimina los men\u00fas de administraci\u00f3n de nivel superior. En el ejemplo de c\u00f3digo anterior, estoy eliminando los siguientes men\u00fas de administraci\u00f3n: Plugins, Temas, Herramientas, Usuarios, P\u00e1ginas y Opciones.<\/li>\n<\/ul>\n<p>Despu\u00e9s de guardar el archivo del plugin, aqu\u00ed hay una instant\u00e1nea del tablero de WordPress con un administrador conectado.<\/p>\n<figure id=\"attachment_72251\" aria-describedby=\"caption-attachment-72251\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72251 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/el-panel-de-administracion-predeterminado-de-wordpress.png\" alt=\"El panel de administraci\u00f3n predeterminado de WordPress\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72251\" class=\"wp-caption-text\">El panel de administraci\u00f3n predeterminado de WordPress<\/figcaption><\/figure>\n<p>Y aqu\u00ed hay una captura de pantalla del tablero de WordPress con un usuario no administrador conectado.<\/p>\n<figure id=\"attachment_72249\" aria-describedby=\"caption-attachment-72249\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-72249\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/After-Hiding-Admin-Menus-for-WordPress-Users.png\" alt=\"Hiding the sensitive admin menus to non-admin users using actions\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72249\" class=\"wp-caption-text\">Hiding sensitive admin menu items from non-admin users<\/figcaption><\/figure>\n<p>Esta soluci\u00f3n s\u00f3lo oculta los elementos del men\u00fa de administraci\u00f3n especificados para que no aparezcan en el tablero de WordPress. Todos los usuarios pueden seguir accediendo a ellos introduciendo las URL del men\u00fa en sus navegadores.<\/p>\n<p>Para deshabilitar el acceso a ciertos <a href=\"https:\/\/kinsta.com\/es\/blog\/roles-de-usuario\/\" target=\"_blank\" rel=\"noopener noreferrer\">roles de usuario<\/a> a determinados men\u00fas, es necesario editar sus capacidades.<\/p>\n<h3>Enganchar un filtro<\/h3>\n<p>Los filtros proporcionan una forma para que tu c\u00f3digo personalizado modifique los datos utilizados por otras funciones de WordPress. A diferencia de las acciones, las funciones enganchadas a los filtros necesitan devolver un valor.<\/p>\n<h4>La funci\u00f3n add_filter() Filter<\/h4>\n<p>Puedes enganchar una funci\u00f3n de devoluci\u00f3n de llamada a un filtro siguiendo estos pasos:<\/p>\n<ol>\n<li>Define una <strong>funci\u00f3n de Callback<\/strong> que se ejecutar\u00e1 cuando WordPress dispare el filtro. Las funciones Callback para los filtros deben tener al menos un argumento especificado, ya que todos los filtros pasan al menos un valor a sus funciones Callback.<\/li>\n<li>Registra la funci\u00f3n de devoluci\u00f3n de llamada a un filtro con la funci\u00f3n <strong><code>add_filter()<\/code><\/strong>. El filtro se encargar\u00e1 de llamar a la funci\u00f3n de devoluci\u00f3n de llamada. Seg\u00fan el Codex de WordPress, la funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener noreferrer\">add_filter()<\/a> necesita pasar al menos dos par\u00e1metros:\n<ul>\n<li>El nombre del filtro al que engancharse.<\/li>\n<li>Nombre de la funci\u00f3n de llamada que se ejecutar\u00e1 cuando el filtro se dispare.<\/li>\n<\/ul>\n<\/li>\n<li>La funci\u00f3n <strong><code>add_filter()<\/code><\/strong> tambi\u00e9n acepta dos par\u00e1metros opcionales adicionales para establecer <strong><code>priority<\/code><\/strong> y <strong><code>number of arguments<\/code><\/strong>. Estos par\u00e1metros funcionan de la misma manera que con la funci\u00f3n <strong><code>add_action()<\/code><\/strong>.<\/li>\n<\/ol>\n<p>Aqu\u00ed hay un ejemplo de c\u00f3mo puedes usar la funci\u00f3n <strong><code>add_filter()<\/code><\/strong> para enganchar una funci\u00f3n de devoluci\u00f3n de llamada a un filtro.<\/p>\n<pre><code class=\"language-php\">\/\/ define the filter callback function with at least one argument passed\n\/\/ the number of arguments that you can pass depends on how the filter is defined\nfunction filter_callback_function( $arg1, $arg2 ) {\n\u00a0 \u00a0 \/\/ make your code do something with the arguments and return something\n\u00a0 \u00a0 return $something;\n}\n\n\/\/ now hook the callback function to the 'example_filter'\nadd_filter( 'example_filter', 'filter_callback_function', [priority], [no_of_args] );\n\n\/\/ '10' is the default priority set for the callback function\n\/\/ and '1' is the default number of arguments passed<\/code><\/pre>\n<h4>Ejemplo de enganche de un filtro<\/h4>\n<p>WordPress proporciona un filtro llamado <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/login_message\" target=\"_blank\" rel=\"noopener noreferrer\">login_message<\/a> para filtrar el mensaje que se muestra en la p\u00e1gina de inicio de sesi\u00f3n encima del formulario de inicio de sesi\u00f3n. El valor devuelto por este filtro puede tener un <a href=\"https:\/\/kinsta.com\/es\/blog\/editores-html-gratuitos\/\" target=\"_blank\" rel=\"noopener noreferrer\">marcado HTML<\/a>.<\/p>\n<p>Conect\u00e9monos al filtro <strong>login_message<\/strong> y modifiquemos el mensaje que aparece en la pantalla de acceso.<\/p>\n<pre><code class=\"language-php\">\/\/ show a custom login message above the login form\nfunction custom_login_message( $message ) {\n\u00a0 \u00a0 if ( empty( $message ) ) {\n\u00a0 \u00a0 \u00a0 \u00a0 return \"&lt;h2&gt;Welcome to Let's Develop by Salman Ravoof! Please log in to start learning.&lt;\/h2&gt;\";\n\u00a0 \u00a0 } \n    else {\n\u00a0 \u00a0 \u00a0 \u00a0 return $message;\n\u00a0 \u00a0 }\n}\nadd_filter( 'login_message', 'custom_login_message' );<\/code><\/pre>\n<p>La declaraci\u00f3n <strong><code>if-else<\/code><\/strong> en la funci\u00f3n de devoluci\u00f3n de llamada comprueba si el mensaje de inicio de sesi\u00f3n ya est\u00e1 configurado, principalmente por otro plugin o tema. En tales casos, la funci\u00f3n de devoluci\u00f3n de llamada devuelve el valor original sin hacer ning\u00fan cambio. Esta es una forma de evitar conflictos con otros plugins o temas.<\/p>\n<p>Puedes ver el mensaje que se muestra encima del formulario de acceso en la <a href=\"https:\/\/kinsta.com\/es\/blog\/encontrar-wordpress-url\/\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de acceso de WordPress<\/a>.<\/p>\n<figure id=\"attachment_72252\" aria-describedby=\"caption-attachment-72252\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72252 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/mensaje-personalizado-de-inicio-de-sesion.png\" alt=\"Mostrando un mensaje personalizado de inicio de sesi\u00f3n encima del formulario de inicio de sesi\u00f3n\" width=\"1100\" height=\"514\"><figcaption id=\"caption-attachment-72252\" class=\"wp-caption-text\">Mostrando un mensaje personalizado de inicio de sesi\u00f3n encima del formulario de inicio de sesi\u00f3n<\/figcaption><\/figure>\n<p>Puedes dar estilo a todos los elementos de la p\u00e1gina de inicio de sesi\u00f3n enlazando hojas de estilo personalizadas. Al hacerlo, podr\u00e1s personalizar completamente tu p\u00e1gina de inicio de sesi\u00f3n predeterminada de WordPress.<\/p>\n<p>Aprender\u00e1s a cargar hojas de estilo personalizadas usando acciones en la secci\u00f3n \u00abPersonalizar la p\u00e1gina de inicio de sesi\u00f3n de WordPress con ganchos\u00bb.<\/p>\n<h4>Encontrar filtros con el apoyo de WordPress<\/h4>\n<p>En cualquier lugar donde WordPress procese o modifique datos, es casi seguro que se puede encontrar un filtro para engancharlo y cambiarlo. Piensa en los filtros como una interfaz entre la <a href=\"https:\/\/kinsta.com\/es\/blog\/solucionar-reparar-problemas-base-datos\/\" target=\"_blank\" rel=\"noopener noreferrer\">base de datos de WordPress<\/a> y el navegador.<\/p>\n<p>Puedes encontrar una lista exhaustiva de todos los filtros soportados por WordPress en la p\u00e1gina de <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\" target=\"_blank\" rel=\"noopener noreferrer\">Referencia de la API\/Filtro del Plugin<\/a>.<\/p>\n<figure id=\"attachment_72258\" aria-describedby=\"caption-attachment-72258\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72258 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/referencia-de-filtro.png\" alt=\"WordPress proporciona una variedad de filtros para enganchar en\" width=\"1100\" height=\"514\"><figcaption id=\"caption-attachment-72258\" class=\"wp-caption-text\">WordPress proporciona una variedad de filtros para enganchar en<\/figcaption><\/figure>\n<p>Todos los filtros listados all\u00ed se dividen en m\u00faltiples categor\u00edas y se ordenan de arriba a abajo en el orden de ejecuci\u00f3n de WordPress.<\/p>\n<p>Si quieres encontrar filtros para enganchar en el c\u00f3digo fuente de WordPress, realiza una b\u00fasqueda del t\u00e9rmino \u00ab<strong>apply_filters<\/strong>\u00bb y obtendr\u00e1s toneladas de resultados. La <a href=\"https:\/\/developer.wordpress.org\/reference\/\" target=\"_blank\" rel=\"noopener noreferrer\">Referencia del C\u00f3digo de WordPress<\/a> tambi\u00e9n es un gran lugar para buscar todo lo que est\u00e1 incluido en WordPress, incluyendo acciones y filtros.<\/p>\n<h4>\u00bfC\u00f3mo el n\u00facleo de WordPress utiliza los filtros?<\/h4>\n<p>El propio WordPress Core utiliza muchos de sus filtros incorporados para modificar los datos utilizados por sus diversas funciones.<\/p>\n<p>Considera el filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/the_content\/\" target=\"_blank\" rel=\"noopener noreferrer\">the_content<\/a> por ejemplo. Filtra el contenido de los mensajes despu\u00e9s de ser recuperado de la base de datos y antes de que se muestre en el navegador.<\/p>\n<p>Al igual que con las acciones, puedes encontrar la mayor\u00eda de las funciones de filtro de WordPress Core relacionadas con el gancho <strong><code>the_content<\/code><\/strong> en el archivo <strong><code>wp-includes\/default-filters.php<\/code><\/strong>.<\/p>\n<p>Aqu\u00ed hay una lista de todas las funciones b\u00e1sicas <strong><code>add_filter()<\/code><\/strong> que se enganchan en el filtro <strong><code>the_content<\/code><\/strong>:<\/p>\n<pre><code class=\"language-php\">add_filter( 'the_content', 'do_blocks', 9 );\nadd_filter( 'the_content', 'wptexturize' );\nadd_filter( 'the_content', 'convert_smilies', 20 );\nadd_filter( 'the_content', 'wpautop' );\nadd_filter( 'the_content', 'shortcode_unautop' );\nadd_filter( 'the_content', 'prepend_attachment' );\nadd_filter( 'the_content', 'wp_make_content_images_responsive' );\nadd_filter( 'the_content', 'do_shortcode', 11 ); \/\/ AFTER wpautop().\u00a0<\/code><\/pre>\n<p>Observa la prioridad especificada para ciertas funciones de devoluci\u00f3n de llamada.<\/p>\n<p>Por ejemplo, la funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_blocks\/\" target=\"_blank\" rel=\"noopener noreferrer\">do_blocks()<\/a> analiza cualquier bloque din\u00e1mico en el contenido del post y lo vuelve a hacer compatible con el <a href=\"https:\/\/kinsta.com\/es\/blog\/gutenberg-wordpress-editor\/\" target=\"_blank\" rel=\"noopener noreferrer\">nuevo editor de bloques de WordPress<\/a>. Se especifica una prioridad m\u00e1s alta que la predeterminada (10) para asegurarse de que el contenido est\u00e9 listo para ser bloqueado antes de que se ejecuten las otras funciones.<\/p>\n<p>La funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/convert_smilies\/\" target=\"_blank\" rel=\"noopener noreferrer\">convert_smilies()<\/a> est\u00e1 configurada para ejecutarse con una prioridad menor ya que su tarea es convertir los smileys de texto en sprites de imagen. Hacer que se ejecute al final despu\u00e9s de filtrar todo el contenido del post tiene sentido.<\/p>\n<p>Dato curioso: Los c\u00f3digos cortos son un subconjunto de filtros. Toman la entrada del c\u00f3digo corto, la procesan y luego devuelven la salida a \u00e9l. Aprende m\u00e1s sobre los c\u00f3digos cortos en esta <a href=\"https:\/\/kinsta.com\/es\/blog\/codigos-cortos-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">gu\u00eda definitiva de WordPress sobre c\u00f3digos cortos<\/a>.<\/p>\n<h4>Otras funciones del filtro<\/h4>\n<p>Aunque <strong><code>add_filter()<\/code><\/strong> es la funci\u00f3n de filtro m\u00e1s utilizada, hay muchas otras funciones de filtro \u00fatiles. Analic\u00e9moslas todas en profundidad.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/has_filter\">has_filter()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n comprueba si el filtro especificado est\u00e1 enganchado por alguna funci\u00f3n. Acepta dos par\u00e1metros. El primer par\u00e1metro es para introducir el nombre del filtro. El segundo par\u00e1metro es opcional y sirve para introducir el nombre de la funci\u00f3n de callback.<\/p>\n<pre><code class=\"language-php\">has_filter( 'filter_name', 'function_to_check' );<\/code><\/pre>\n<p>Si especificas s\u00f3lo el primer par\u00e1metro, devolver\u00e1 <code><strong>true<\/strong><\/code> si <strong><code>filter_name<\/code><\/strong> est\u00e1 enganchado por <em>cualquier<\/em> funci\u00f3n.<\/p>\n<p>Sin embargo, si se especifican los dos par\u00e1metros, entonces devolver\u00e1 <strong><code>false<\/code><\/strong> si la funci\u00f3n de callback mencionada no est\u00e1 registrada con el filtro dado. Si encuentra la funci\u00f3n de callback registrada con el filtro, entonces devolver\u00e1\u00a0 <strong><code>priority<\/code><\/strong> (un entero) establecida para esa funci\u00f3n en este filtro.<\/p>\n<p>Una posible aplicaci\u00f3n de la funci\u00f3n <strong><code>has_filter()<\/code><\/strong> es comprobar si alg\u00fan filtro ya ha sido enganchado, y en base a eso seguir adelante con la ejecuci\u00f3n del c\u00f3digo.<\/p>\n<pre><code class=\"language-php\">\/\/ check to see if 'the_content' filter has been hooked\nif ( ! has_filter( 'the_content' ) {\n\u00a0 \u00a0 \/\/ hook the filter if and only if it hasn't been hooked before\n\u00a0 \u00a0 add_filter( 'the_content', 'modify_the_content' );\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\">apply_filters()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de filtro es como la funci\u00f3n de acci\u00f3n <strong><code>do_action()<\/code><\/strong>. Cualquier funci\u00f3n de callback enganchada a este filtro se ejecutar\u00e1 dondequiera que esta funci\u00f3n est\u00e9 en el c\u00f3digo de WordPress.<\/p>\n<p>Tambi\u00e9n puedes utilizar esta funci\u00f3n para crear un nuevo filtro personalizado especificando el nombre del filtro y el valor del mismo como par\u00e1metros.<\/p>\n<pre><code class=\"language-php\">apply_filters( 'filter_name', 'value_to_filter', [argument1], [argument2] );<\/code><\/pre>\n<p>No olvides especificar cualquier argumento adicional si quieres pasarlo a tus funciones de callback. La mayor\u00eda de los filtros s\u00f3lo usan un argumento, as\u00ed que es f\u00e1cil perderse la definici\u00f3n de los adicionales.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/apply_filters_ref_array\">apply_filters_ref_array()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n es como la funci\u00f3n <strong><code>apply_filters()<\/code><\/strong>, excepto que todos los argumentos que acepta est\u00e1n agrupados en un array.<\/p>\n<pre><code class=\"language-php\">\/\/ an example array\n$arguments_array = array( 'some_value', 'foo', false, 'another_value' );\n\napply_filters_ref_array( 'example_filter', $arguments_array );<\/code><\/pre>\n<p>Esta funci\u00f3n de filtrado puede ser \u00fatil cuando se tienen muchos argumentos que pasar o si todos ellos ya est\u00e1n en un arreglo. Aseg\u00farate de que los argumentos dentro del array est\u00e9n en el orden correcto.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/current_filter\">current_filter()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de filtrado recupera el nombre del filtro o la acci\u00f3n actual que se est\u00e1 ejecutando. No es necesario especificar ning\u00fan par\u00e1metro ya que se ejecuta dentro de la funci\u00f3n de callback.<\/p>\n<p>Aqu\u00ed hay un ejemplo de su uso:<\/p>\n<pre><code class=\"language-php\">function example_callback() {\n\u00a0 \u00a0 echo current_filter(); \/\/ 'the_title' will be echoed\n\u00a0 \u00a0 return\n}\nadd_filter( 'the_title', 'example_callback' );<\/code><\/pre>\n<p>A pesar de su nombre, esta funci\u00f3n puede recuperar el nombre tanto de las acciones como de los filtros.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_filter\/\">remove_filter()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de filtro elimina la funci\u00f3n de callback asociada al filtro especificado. Funciona exactamente como la funci\u00f3n <strong><code>remove_action()<\/code><\/strong>. Puedes usarla para eliminar las funciones predeterminadas de WordPress registradas con un filtro espec\u00edfico y, si es necesario, sustituirlas por tus propias funciones.<\/p>\n<pre><code class=\"language-php\">remove_filter( 'filter_name', 'function_to_be_removed', [priority] );<\/code><\/pre>\n<p>Para desenganchar una funci\u00f3n de callback enganchada a un filtro, los par\u00e1metros <strong><code>function_to_be_removed<\/code><\/strong> y <strong><code>priority<\/code><\/strong> deben ser id\u00e9nticos a los argumentos utilizados al enganchar la funci\u00f3n de callback.<\/p>\n<p>Si el filtro se ha a\u00f1adido desde dentro de una clase, lo que suele ser el caso cuando se a\u00f1aden los plugins, entonces hay que acceder <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_filter\/#comment-613\" target=\"_blank\" rel=\"noopener noreferrer\">a la variable de la clase para eliminar el filtro<\/a>.<\/p>\n<pre><code class=\"language-php\">\/\/ access the class variable first, and then remove the filter through it\nglobal $some_class;\n\nremove_filter( 'the_content', array($some_class, 'class_filter_callback') );<\/code><\/pre>\n<p>Veamos un gran ejemplo de <strong>remove_filter()<\/strong> en acci\u00f3n.<\/p>\n<p>El <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-de-ecommerce\/#woocommerce\" target=\"_blank\" rel=\"noopener noreferrer\">plugin WooCommerce<\/a> utiliza la funci\u00f3n de llamada <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-wc_lostpassword_url.html#13-39\" target=\"_blank\" rel=\"noopener noreferrer\">wc_lostpassword_url()<\/a> enganchada a su filtro <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-wc_lostpassword_url.html#41\" target=\"_blank\" rel=\"noopener noreferrer\">lostpassword_url<\/a> para redirigir \u00ab<em>Lost Your Password?<\/em>\u00bb por parte de los usuarios.<\/p>\n<p>Se necesita que cualquier usuario haga clic en ese enlace para una p\u00e1gina de inicio personalizada con la URL <strong><code>\/mi-cuenta \/contrase\u00f1a-perdida<\/code><\/strong>. Sin este filtro, los llevar\u00eda a la URL de inicio de sesi\u00f3n est\u00e1ndar de WordPress en <strong><code>\/wp-login.php<\/code><\/strong>.<\/p>\n<p>Digamos que quiere restablecer esta funcionalidad y enviar a tus usuarios a la <a href=\"https:\/\/kinsta.com\/es\/blog\/cambiar-contrasenas-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de recuperaci\u00f3n de contrase\u00f1as predeterminada<\/a> o a una p\u00e1gina completamente separada. Puedes eliminar esta funci\u00f3n de callback de la siguiente manera:<\/p>\n<pre><code class=\"language-php\">remove_filter( 'lostpassword_url', 'wc_lostpassword_url', 10 );<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_all_filters\">remove_all_filters()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de filtro elimina todas las funciones de callback registradas en un filtro.<\/p>\n<pre><code class=\"language-php\">remove_all_filters( 'filter_name', [priority] );<\/code><\/pre>\n<p>Es similar a la funci\u00f3n<strong><code>remove_all_actions()<\/code><\/strong>.<\/p>\n<p>El popular <a href=\"https:\/\/github.com\/KimcoBlogSC\/Blog\/blob\/master\/wp-content\/plugins\/advanced-excerpt\/functions\/functions.php\" target=\"_blank\" rel=\"noopener noreferrer\">plugin Advanced Excerpts<\/a> utiliza esta funci\u00f3n para eliminar todas las funciones predeterminadas enganchadas a los filtros <strong><code>the_excerpt<\/code><\/strong> y <strong><code>get_the_excerpt<\/code><\/strong>. Despu\u00e9s de hacer eso, entonces engancha su propia funci\u00f3n de callback al filtro.<\/p>\n<pre><code class=\"language-php\">\/\/ Ensure our filter is hooked, regardless of the page type \nif ( ! has_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) ) ) {\n    remove_all_filters( 'get_the_excerpt' ); \n    remove_all_filters( 'the_excerpt' ); \n    add_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) );\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/doing_filter\/\">doing_filter()<\/a><\/li>\n<\/ul>\n<p>Esta funci\u00f3n de filtro comprueba si el filtro especificado se est\u00e1 ejecutando en este momento.<\/p>\n<pre><code class=\"language-php\">if ( doing_filter( 'save_post' ) ) {\n  \u00a0 \/\/ run your code here\n}<\/code><\/pre>\n<p>Devuelve un valor booleano (<strong><code>true<\/code><\/strong> o <strong><code>false<\/code><\/strong>).<\/p>\n<p>Debes notar la diferencia entre esta funci\u00f3n y la funci\u00f3n <strong><code>current_filter()<\/code><\/strong>, que devuelve el nombre del filtro o la acci\u00f3n que se est\u00e1 ejecutando (una cadena).<\/p>\n<h4>Filtros Ejemplo 1: A\u00f1adir un filtro de profanidad para los comentarios<\/h4>\n<p>Gestionar todos los <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-comentarios-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">comentarios de tu sitio de WordPress<\/a> puede ser un proceso engorroso. El filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_text\/\" target=\"_blank\" rel=\"noopener noreferrer\">comment_text<\/a> te permite establecer reglas para modificar los comentarios antes de que se impriman en la pantalla.<\/p>\n<figure id=\"attachment_72268\" aria-describedby=\"caption-attachment-72268\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72268 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/comentarios-sin-filtrar.png\" alt=\"Los comentarios sin filtrar con blasfemias ficticias marcadas\" width=\"1100\" height=\"563\"><figcaption id=\"caption-attachment-72268\" class=\"wp-caption-text\">Los comentarios sin filtrar con blasfemias ficticias marcadas<\/figcaption><\/figure>\n<p>Puedes ordenar a WordPress que elimine autom\u00e1ticamente cualquier comentario antes de que se muestre a los visitantes de tu sitio. Vamos a ello.<\/p>\n<pre><code class=\"language-php\">\/\/ hook into the 'comment_text' filter with the callback function\nadd_filter( 'comment_text', 'the_profanity_filter' );\n\n\/\/ define a callback function to filter profanities in comments \nfunction the_profanity_filter( $comment_text ) {\n    \/\/ define an array of profane words and count how many are there \n    $profaneWords = array('fudge', 'darn', 'pickles', 'blows', 'dangit');\n    $profaneWordsCount = sizeof($profaneWords);\n    \n    \/\/ loop through the profanities in $comment_text and replace them with '*'\n    for($i=0; $i &lt; $profaneWordsCount; $i++) {\n        $comment_text = str_ireplace( $profaneWords[$i], str_repeat('*', strlen( $profaneWords[$i]) ), $comment_text );\n    } \n    \n    return $comment_text;\n}<\/code><\/pre>\n<p>Aqu\u00ed hay un desglose l\u00ednea por l\u00ednea del c\u00f3digo:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_text\/\" target=\"_blank\" rel=\"noopener noreferrer\">comment_text<\/a> es un gancho de filtro que permite modificar el texto de un comentario antes de que el navegador lo muestre. Puedes registrar tu funci\u00f3n de callback con \u00e9l para filtrar su salida.<\/li>\n<li>La funci\u00f3n <strong><code>add_filter()<\/code><\/strong> te permite engancharte al filtro <strong>comment_text<\/strong> y adjuntarle una funci\u00f3n de callback.<\/li>\n<li><strong><code>the_profanity_filter()<\/code><\/strong> es el nombre de la funci\u00f3n de callback. S\u00f3lo acepta un par\u00e1metro, que es una cadena que contiene el texto del comentario. Defina esta funci\u00f3n personalizada con la l\u00f3gica de c\u00f3digo apropiada.<\/li>\n<li>Almacena todas las palabras profanas en una matriz PHP llamada <strong><code>profaneWords<\/code><\/strong>. Puedes a\u00f1adir tantas palabras como quieras a esta matriz. Estoy almacenando el tama\u00f1o de esta matriz en la variable <strong><code>profaneWordsCount<\/code><\/strong> con la ayuda de la <a href=\"https:\/\/www.php.net\/manual\/en\/function.sizeof.php\" target=\"_blank\" rel=\"noopener noreferrer\">funci\u00f3n sizeof() PHP<\/a>.<\/li>\n<li>Revisa todas las palabras profanas y usa la <a href=\"https:\/\/www.php.net\/manual\/en\/function.str-ireplace.php\" target=\"_blank\" rel=\"noopener noreferrer\">funci\u00f3n str_ireplace()<\/a> por defecto de PHP para reemplazar cualquiera de las palabras profanas que coincidan con los s\u00edmbolos <strong>*<\/strong>. Ya que esta es una funci\u00f3n de reemplazo de cadenas que no distingue entre may\u00fasculas y min\u00fasculas, no tiene que preocuparse por las may\u00fasculas. Comprueba las distintas formas de ejecutar <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-buscar-y-reemplazar\/\">buscar y reemplazar<\/a>.<\/li>\n<li>Utiliza <strong><code>return<\/code><\/strong> para obtener el texto del comentario filtrado.<\/li>\n<\/ul>\n<p>Guarda los cambios en tu archivo de plugin personalizado y recarga cualquier publicaci\u00f3n con comentarios. Todas las palabras que has incluido en la matriz de <strong>profaneWords<\/strong> deben ser reemplazadas por s\u00edmbolos &#8216;<strong>*&#8217;<\/strong>.<\/p>\n<figure id=\"attachment_72256\" aria-describedby=\"caption-attachment-72256\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72256 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/censurar-la-blasfemia.png\" alt=\"Censurar la blasfemia en los comentarios con s\u00edmbolos '*'.\" width=\"1100\" height=\"563\"><figcaption id=\"caption-attachment-72256\" class=\"wp-caption-text\">Censurar la blasfemia en los comentarios con s\u00edmbolos &#8216;*&#8217;.<\/figcaption><\/figure>\n<p>Los comentarios originales seguir\u00e1n estando disponibles tal como est\u00e1n en la base de datos. Este filtro s\u00f3lo modifica el texto de los comentarios antes de que se emita al frontend.<\/p>\n<figure id=\"attachment_72263\" aria-describedby=\"caption-attachment-72263\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72263 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/comentario-original-en-el-backend-del-sitio.png\" alt=\"El comentario original en el backend del sitio\" width=\"1100\" height=\"498\"><figcaption id=\"caption-attachment-72263\" class=\"wp-caption-text\">El comentario original en el backend del sitio<\/figcaption><\/figure>\n<p>Una vez que te enganchas al filtro correcto, puedes hacer un mont\u00f3n de cosas geniales con \u00e9l.<\/p>\n<p>Por ejemplo, tambi\u00e9n puedes usar el filtro <strong><code>comment_text<\/code><\/strong> para eliminar cualquier URL de todos los comentarios (aseg\u00farate de leer esta gu\u00eda detallada sobre \u00bf<a href=\"https:\/\/kinsta.com\/es\/blog\/comentarios-spam-wordpress\/\">C\u00f3mo detener los comentarios de spam en WordPress?<\/a>).<\/p>\n<p>O puedes engancharte al filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_comment_approved\/\">pre_comentario_aprobado<\/a> y marcar los comentarios como aprobados, spam, o thrash basado en criterios predefinidos.<\/p>\n<h4>Filtros Ejemplo 2: Insertar contenido despu\u00e9s de un post<\/h4>\n<p>Ya has visto c\u00f3mo WordPress utiliza el filtro <strong><code>the_content<\/code><\/strong> para modificar el contenido de los mensajes o de la p\u00e1gina. Usemos el mismo filtro para a\u00f1adir algo al final de cada post.<\/p>\n<pre><code class=\"language-php\">\/\/ hook into 'the_content' filter with a callback function\nadd_filter( 'the_content', 'insert_content_below' );\n\n\/\/ define the callback function to insert something below the post\nfunction insert_content_below( $content ) {\n    \/\/ check to see if we're inside the main loop in a single post\n    if ( is_single() && in_the_loop() && is_main_query() ) {\n  \u00a0     return $content . \"&lt;h3 style=\\\"text-align: center;\\\"&gt;Let me insert myself here&lt;\/h3&gt;&lt;p style=\\\"text-align: center;border: 3px solid #5333ed;\\\"&gt;I'll appear after the post. You can insert anything here. Even HTML. Headers, links, images, scripts, I'll take them all and append it to the end of the post content. You can also give me a class, so you can style me easily with CSS style sheets.&lt;\/p&gt;\" ;\n    } \n    \n    return $content;\n}<\/code><\/pre>\n<p>Entendiendo la l\u00f3gica del c\u00f3digo en el ejemplo anterior:<\/p>\n<ul>\n<li>el gancho de filtro de <strong><code>the_content<\/code><\/strong> te ayuda a coger el contenido del post actual y personalizarlo.<\/li>\n<li>Utiliza la funci\u00f3n <strong><code>add_filter()<\/code><\/strong> para enganchar en el filtro de <strong><code>the_content<\/code><\/strong> con la funci\u00f3n de callback <strong><code>insert_content_below()<\/code><\/strong>.<\/li>\n<li>Define la funci\u00f3n de callback pasando el contenido del mensaje actual como un par\u00e1metro (<strong><code>$content<\/code><\/strong>).<\/li>\n<li>Dentro de la funci\u00f3n de callback, comprueba que s\u00f3lo est\u00e1s filtrando el contenido de la consulta principal, que en este caso es el contenido del post. Si no verificas esto, a veces el c\u00f3digo filtrar\u00e1 involuntariamente el contenido de otros lugares como las barras laterales y los pies de p\u00e1gina.<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/is_main_query\/\" target=\"_blank\" rel=\"noopener noreferrer\">is_main_query()<\/a> y los condicionales <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/in_the_loop\/#comment-1364\" target=\"_blank\" rel=\"noopener noreferrer\">in_the_loop()<\/a> determinan si la consulta es una consulta principal y ocurre dentro del bucle principal de WordPress.<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/is_single\/\" target=\"_blank\" rel=\"noopener noreferrer\">is_single()<\/a> condicional comprueba si la consulta es para un solo puesto.<\/li>\n<li>Usa el <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.string.php\" target=\"_blank\" rel=\"noopener noreferrer\">operador de concatenaci\u00f3n de cadenas de<\/a> PHP (<strong><code>$content . \"tus adiciones\"<\/code><\/strong>) para a\u00f1adir cosas extra al contenido de la p\u00e1gina.<\/li>\n<li><strong><code>return<\/code><\/strong> el comentario filtrado si todos los condicionales anteriores coinciden. Si no es as\u00ed, entonces devuelva el contenido sin cambios.<\/li>\n<\/ul>\n<p>Guarda tu archivo de plugin, carga cualquier publicaci\u00f3n en tu sitio y despl\u00e1zate hasta el final.<\/p>\n<figure id=\"attachment_72261\" aria-describedby=\"caption-attachment-72261\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72261 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/insertar-algo-al-final-del-contenido-del-post.png\" alt=\"Insertar algo al final del contenido del post\" width=\"1100\" height=\"491\"><figcaption id=\"caption-attachment-72261\" class=\"wp-caption-text\">Insertar algo al final del contenido del post<\/figcaption><\/figure>\n<p>Puedes usar la misma l\u00f3gica para a\u00f1adir cualquier cosa al principio de todos tus posts invirtiendo la posici\u00f3n de los par\u00e1metros de concatenaci\u00f3n de cadenas (<strong><code>\"tus adiciones\" . $contenido<\/code><\/strong>).<\/p>\n<h3>Personalizar la p\u00e1gina de inicio de sesi\u00f3n de WordPress con ganchos<\/h3>\n<p>Usemos tanto acciones como filtros para personalizar la <a href=\"https:\/\/kinsta.com\/es\/blog\/encontrar-wordpress-url\/\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de inicio de sesi\u00f3n predeterminada de WordPress<\/a>. Para ello, crear\u00e9 un nuevo plugin llamado <strong>P\u00e1gina de inicio de sesi\u00f3n personalizada<\/strong> de <strong>Sal<\/strong>. Puedes encontrar el c\u00f3digo fuente completo de este plugin al final de esta secci\u00f3n.<\/p>\n<figure id=\"attachment_72243\" aria-describedby=\"caption-attachment-72243\" style=\"width: 1110px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72243 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/pantalla-de-acceso-personalizada-de-wordpress.jpg\" alt=\"La \u00faltima pantalla de acceso personalizada de WordPress\" width=\"1110\" height=\"700\"><figcaption id=\"caption-attachment-72243\" class=\"wp-caption-text\">La \u00faltima pantalla de acceso personalizada de WordPress<\/figcaption><\/figure>\n<p>Comencemos agregando los campos de encabezado del plugin est\u00e1ndar y registr\u00e1ndolo en WordPress.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name:  Sal Custom Login Page\nVersion:  1.0\nDescription:  Demonstrating WordPress Hooks (Actions and Filters) by customizing the WordPress login page.\nAuthor:  Salman Ravoof\nAuthor URI:  https:\/\/www.salmanravoof.com\/License: GPLv2 or later\nLicense URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain:  sal-custom-login-page\n*\/\n\n\/\/ enqueueing the custom style sheet on WordPress login page\nadd_action( 'login_enqueue_scripts', 'salhooks_login_stylesheet');\nfunction salhooks_login_stylesheet() {\n    \/\/ Load the style sheet from the plugin folder\n    wp_enqueue_style( 'sal-custom-login-page', plugin_dir_url( __FILE__ ).'sal-custom-login-page-styles.css' );\n}<\/code><\/pre>\n<p>Primero, engancha la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_enqueue_scripts\/\" target=\"_blank\" rel=\"noopener noreferrer\">login_enque_scripts<\/a> para poner en cola tu hoja de estilo personalizada. Todos los scripts o estilos que pongas en cola aqu\u00ed se incluyen en la secci\u00f3n de encabezado de tu p\u00e1gina de inicio de sesi\u00f3n.<br \/>\nSi quieres cargar scripts personalizados y hojas de estilo en el frontend de tu sitio (en lugar de en el backend de administraci\u00f3n o en el \u00e1rea de login), entonces necesitas engancharte a la acci\u00f3n<strong><code>wp_enqueue_scripts<\/code><\/strong>. Puedes leer m\u00e1s sobre ello en el <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/wp_enqueue_scripts\/\" target=\"_blank\" rel=\"noopener noreferrer\">Codex de WordPress<\/a> y en <a href=\"https:\/\/kinsta.com\/es\/blog\/wp-enqueue-scripts\/\" target=\"_blank\" rel=\"noopener noreferrer\">el art\u00edculo de Kinsta sobre \u00bfc\u00f3mo usar wp_enqueue_scripts?<\/a><\/p>\n<p>Dentro de la funci\u00f3n callback <strong><code>salhooks_login_stylesheet()<\/code><\/strong>, usa la funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_enqueue_style\/\" target=\"_blank\" rel=\"noopener noreferrer\">wp_enqueue_style()<\/a> para cargar la hoja de estilo personalizada (<strong><code>sal-custom-login-page-styles.css<\/code><\/strong>) colocada en el mismo directorio del plugin. La funci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/plugin_dir_url\/\" target=\"_blank\" rel=\"noopener noreferrer\">( __FILE__ )<\/a> incorporada en WordPress facilita la obtenci\u00f3n de la ruta URL (con una barra inclinada) del directorio actual del plugin.<\/p>\n<p>No voy a explicar los <a href=\"https:\/\/kinsta.com\/es\/blog\/css-wordpress\/#wordpress-and-css\">estilos CSS<\/a> aplicados aqu\u00ed, pero puedes encontrarlos todos en el c\u00f3digo fuente enlazado al final de esta secci\u00f3n.<\/p>\n<pre><code class=\"language-php\">\/\/ Custom login ERROR message to keep the site more secure\nadd_filter( 'login_errors', 'salhooks_remove_login_errors', 10 );\nfunction salhooks_remove_login_errors() {\n    return 'Incorrect credentials. Please try again!';\n}<\/code><\/pre>\n<p>A continuaci\u00f3n, enganch\u00e9 el filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_errors\/\" target=\"_blank\" rel=\"noopener noreferrer\">login_errors<\/a> para cambiar el mensaje de error que se muestra cuando alguien introduce credenciales incorrectas. Filtrar el mensaje de error evitar\u00e1 que los atacantes adivinen tu nombre de usuario f\u00e1cilmente.<\/p>\n<pre><code class=\"language-php\">\/\/ Remove the login form box shake animation for incorrect credentials\nadd_action( 'login_head', 'remove_login_error_shake' );\nfunction remove_login_error_shake() {\n    remove_action( 'login_head', 'wp_shake_js', 12 );\n}<\/code><\/pre>\n<p>Cada vez que alguien introduce credenciales de acceso incorrectas, el cuadro del formulario de acceso se agita agresivamente. Este es un paso opcional, pero lo he incluido para mostrar que tambi\u00e9n se pueden eliminar ciertas caracter\u00edsticas de la p\u00e1gina de inicio de sesi\u00f3n.<\/p>\n<p>Aprender\u00e1s m\u00e1s sobre las funciones <strong><code>remove_action()<\/code><\/strong> y <strong><code>remove_filter()<\/code><\/strong> en la secci\u00f3n final de este art\u00edculo.<\/p>\n<pre><code class=\"language-php\">\/\/ Change the logo and header link above the login form\nadd_filter( 'login_headerurl', 'salhooks_login_headerurl');\nfunction salhooks_login_headerurl( $url ) {\n    $url = 'https:\/\/salmanravoof.com';\n    return $url;\n}\n\nadd_filter( 'login_headertext', 'salhooks_login_headertext');\nfunction salhooks_login_headertext( $text ) {\n    $text = 'Salman Ravoof';\n    return $text;\n}<\/code><\/pre>\n<p>El \u00faltimo paso es cambiar la URL y el texto del encabezado de la sesi\u00f3n. Puedes enganchar los filtros <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_headerurl\/\" target=\"_blank\" rel=\"noopener noreferrer\">login_headerurl<\/a> y <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_headertext\/\" target=\"_blank\" rel=\"noopener noreferrer\">login_headertext<\/a> para modificar ambos.<\/p>\n<p>Si quieres construir sobre este plugin y experimentar m\u00e1s, puedes <a href=\"https:\/\/github.com\/SalmanRavoof\/sal-custom-login-page\" target=\"_blank\" rel=\"noopener noreferrer\">descargar el c\u00f3digo fuente del plugin<\/a> y comenzar.<\/p>\n<h2>Lista de ganchos y recursos de WordPress<\/h2>\n<p>Es dif\u00edcil memorizar todos los diversos ganchos que tiene WordPress. Hay miles de acciones y filtros incorporados para enganchar. Por lo tanto, encontrar un gancho apropiado puede parecer a veces una b\u00fasqueda del tesoro.<\/p>\n<p>Afortunadamente, hay varios recursos que puedes usar para identificar el gancho perfecto para tus necesidades.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/\">Manual de plugins de WordPress &#8211; Hooks<\/a><\/li>\n<\/ul>\n<p>El primer lugar para familiarizarse con los ganchos es el Codex\u00a0de WordPress, en particular su secci\u00f3n de ganchos en el manual de plugins. Aqu\u00ed puedes encontrar informaci\u00f3n esencial sobre los ganchos y enlaces a la documentaci\u00f3n completa sobre todas las acciones y filtros.<\/p>\n<figure id=\"attachment_72272\" aria-describedby=\"caption-attachment-72272\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72272 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-codex-plugin-handbook-hooks.png\" alt=\"Empieza a aprender ganchos con el manual de plugins de WordPress\" width=\"1100\" height=\"539\"><figcaption id=\"caption-attachment-72272\" class=\"wp-caption-text\">Empieza a aprender ganchos con el manual de plugins de WordPress<\/figcaption><\/figure>\n<p>Marca estos \u00fatiles enlaces del Manual de complementos para acelerar tu b\u00fasqueda:<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API#Function_Reference\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin API &#8211; Referencia de la funci\u00f3n de ganchos<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin API &#8211; Referencia de Acci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin API &#8211; Referencia del filtro<\/a><\/li>\n<\/ul>\n<p>Tanto la p\u00e1gina de referencia de la acci\u00f3n como la de referencia del filtro te dar\u00e1n una lista de todos los ganchos que suelen funcionar durante una solicitud espec\u00edfica de WordPress.<\/p>\n<p>Por ejemplo, puedes encontrar todos los ganchos disparados cuando accedes a una p\u00e1gina de administraci\u00f3n, cuando te ocupas de los archivos adjuntos de una p\u00e1gina de correo o de <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-una-taxonomia\/\" target=\"_blank\" rel=\"noopener noreferrer\">las categor\u00edas<\/a>.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/\" target=\"_blank\" rel=\"noopener noreferrer\">Referencia del c\u00f3digo de WordPress<\/a><\/li>\n<\/ul>\n<p>El Codex de WordPress tambi\u00e9n incluye una pr\u00e1ctica herramienta de b\u00fasqueda para encontrar todas sus funciones, ganchos, m\u00e9todos y clases. Esta p\u00e1gina tambi\u00e9n enumera los componentes nuevos y actualizados en la versi\u00f3n m\u00e1s reciente de WordPress. Dir\u00edgete aqu\u00ed primero si quieres encontrar lo que est\u00e1 pasando dentro de WordPress.<\/p>\n<figure id=\"attachment_72271\" aria-describedby=\"caption-attachment-72271\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72271 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/busca-cualquier-cosa-dentro-de-wordpress-aqui.png\" alt=\"Busca cualquier cosa dentro de WordPress aqu\u00ed\" width=\"1100\" height=\"381\"><figcaption id=\"caption-attachment-72271\" class=\"wp-caption-text\">Busca cualquier cosa dentro de WordPress aqu\u00ed<\/figcaption><\/figure>\n<ul>\n<li><a href=\"https:\/\/adambrown.info\/p\/wp_hooks\/hook\" target=\"_blank\" rel=\"noopener noreferrer\">El \u00edndice de ganchos de WordPress de Adam R Brown<\/a><\/li>\n<\/ul>\n<p>Este \u00edndice de ganchos de WordPress clasifica todos los ganchos por tipo, la versi\u00f3n de WordPress en la que debutaron, y si son obsoletos.<\/p>\n<figure id=\"attachment_72248\" aria-describedby=\"caption-attachment-72248\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72248 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/\u00edndice-de-ganchos-de-wordpress-de-adam-r-brown.png\" alt=\"El \u00edndice de ganchos de WordPress de Adam R Brown\" width=\"1100\" height=\"363\"><figcaption id=\"caption-attachment-72248\" class=\"wp-caption-text\">El \u00edndice de ganchos de WordPress de Adam R Brown<\/figcaption><\/figure>\n<p>Clasificando los ganchos en orden de su apariencia te mostrar\u00e1 que los ganchos m\u00e1s antiguos de WordPress siguen siendo los m\u00e1s usados. Si eres <a href=\"https:\/\/kinsta.com\/es\/blog\/php-tutoriales\/\" target=\"_blank\" rel=\"noopener noreferrer\">nuevo en el desarrollo de WordPress<\/a>, familiarizarte con estas acciones y filtros populares es la manera m\u00e1s r\u00e1pida de ponerte al d\u00eda.<\/p>\n<p>Aunque este \u00edndice no ha sido actualizado desde WordPress 5.1, sigue siendo \u00fatil para hojear todos los ganchos principales.<\/p>\n<p>\u00bfTodav\u00eda te cuesta encontrar el gancho que quieres? Una b\u00fasqueda en l\u00ednea con la palabra clave correcta es siempre una buena manera de empezar. Si todo lo dem\u00e1s falla, siempre puedes buscar en el c\u00f3digo de WordPress.<\/p>\n<h2>Encontrar ganchos registrados en una p\u00e1gina de WordPress<\/h2>\n<p>Como hemos visto, WordPress tiene toneladas de ganchos disponibles, pero no todos los ganchos se disparan en cada p\u00e1gina. Si puedes encontrar qu\u00e9 acciones y filtros puedes enganchar en una p\u00e1gina en particular, entonces has ganado la mitad de la batalla.<\/p>\n<p>Aunque puedes usar herramientas avanzadas de depuraci\u00f3n de PHP como <a href=\"https:\/\/xdebug.org\/\">xdebug<\/a> y <a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\" target=\"_blank\" rel=\"noopener noreferrer\">PHPCS<\/a> para ayudar con esto, hay herramientas de desarrollo m\u00e1s sencillas como Debug Bar y Query Monitor que puedes ejecutar dentro de WordPress.<\/p>\n<h3 class=\"has-anchor-hash\">Debug Bar\u00a0con acciones y filtros adicionales<\/h3>\n<p><a href=\"https:\/\/wordpress.org\/plugins\/debug-bar\/\" target=\"_blank\" rel=\"noopener noreferrer\">Debug Bar<\/a> es un plugin oficial de WordPress que agrega un men\u00fa <strong>Debug<\/strong> a tu barra de administraci\u00f3n. Muestra advertencias y avisos de PHP, solicitudes de cach\u00e9, <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-mysql\/\" target=\"_blank\" rel=\"noopener noreferrer\">consultas de MySQL<\/a> y <a href=\"https:\/\/kinsta.com\/es\/blog\/depuracion-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">otra informaci\u00f3n \u00fatil de depuraci\u00f3n<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Este plugin no ha sido actualizado recientemente, ni probado con las \u00faltimas versiones importantes de WordPress. Lo mencionamos como un plugin \u00fatil para aprender m\u00e1s sobre los ganchos de WordPress. Util\u00edzalo en un <a href=\"https:\/\/kinsta.com\/es\/docs\/alojamiento-wordpress\/entorno-staging\/\" target=\"_blank\" rel=\"noopener noreferrer\">entorno de staging<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_72542\" aria-describedby=\"caption-attachment-72542\" style=\"width: 1500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-debug-bar.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72542 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-debug-bar.jpg\" alt=\"WordPress Debug Bar WordPress plugin\" width=\"1500\" height=\"500\"><\/a><figcaption id=\"caption-attachment-72542\" class=\"wp-caption-text\">WordPress Debug Bar WordPress plugin<\/figcaption><\/figure>\n<p>Despu\u00e9s de instalar el plugin, debes agregar el siguiente fragmento de c\u00f3digo al archivo <strong><code>wp-config.php<\/code><\/strong>de tu sitio para habilitar sus funciones de depuraci\u00f3n.<\/p>\n<pre><code class=\"language-php\">define( 'WP_DEBUG', true ); \/\/ tracks PHP Warnings and Notices\ndefine( 'SAVEQUERIES', true ); \/\/ tracks and displays MySQL queries<\/code><\/pre>\n<p>Ahora deber\u00edas ver que la opci\u00f3n del men\u00fa <strong>de depuraci\u00f3n<\/strong> aparece en tu barra de administraci\u00f3n. Al hacer clic en ella te llevar\u00e1 a su panel de control donde podr\u00e1s ver varias consultas y cach\u00e9s adjuntos a la p\u00e1gina desde la que has accedido.<\/p>\n<figure id=\"attachment_72273\" aria-describedby=\"caption-attachment-72273\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72273 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/meunu-debug.png\" alt=\"El men\u00fa \"Debug\" en la barra de administraci\u00f3n de WordPress\" width=\"1100\" height=\"363\"><figcaption id=\"caption-attachment-72273\" class=\"wp-caption-text\">El men\u00fa \u00abDebug\u00bb en la barra de administraci\u00f3n de WordPress<\/figcaption><\/figure>\n<p>A continuaci\u00f3n, debes instalar el plugin <a href=\"https:\/\/wordpress.org\/plugins\/debug-bar-actions-and-filters-addon\/\" target=\"_blank\" rel=\"noopener noreferrer\">Debug Bar Actions and Filters Addon<\/a>. Es una extensi\u00f3n muy \u00fatil que a\u00f1adir\u00e1 dos pesta\u00f1as m\u00e1s al panel de la Barra de depuraci\u00f3n para mostrar las acciones y los filtros activados en la solicitud actual.<\/p>\n<figure id=\"attachment_72253\" aria-describedby=\"caption-attachment-72253\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72253 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/acciones-enumeradas.png\" alt=\"Las acciones enumeradas en su orden de carga para la p\u00e1gina actual\" width=\"1100\" height=\"491\"><figcaption id=\"caption-attachment-72253\" class=\"wp-caption-text\">Las acciones enumeradas en su orden de carga para la p\u00e1gina actual<\/figcaption><\/figure>\n<p>Tambi\u00e9n enumerar\u00e1 todas las funciones enganchadas a ellos con su prioridad.<\/p>\n<figure id=\"attachment_72254\" aria-describedby=\"caption-attachment-72254\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72254 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/debug-bar-con-acciones-y-filtros.png\" alt=\"El plugin de Degug Bar con el Addon de Acciones y Filtros instalado\" width=\"1100\" height=\"509\"><figcaption id=\"caption-attachment-72254\" class=\"wp-caption-text\">El plugin de Degug Bar con el Addon de Acciones y Filtros instalado<\/figcaption><\/figure>\n<p>Puedes hacer clic en el men\u00fa <strong>Debug<\/strong> desde cualquier p\u00e1gina de tu sitio para conocer todas las acciones y filtros que puedes enganchar en esa p\u00e1gina.<\/p>\n<h3>Query Monitor<\/h3>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/query-monitor\/\" target=\"_blank\" rel=\"noopener noreferrer\">Query Monitor<\/a> es un poderoso panel de herramientas de desarrollo para WordPress. Puedes usarlo para indagar en los ganchos disponibles en una p\u00e1gina y su orden de carga.<\/p>\n<figure id=\"attachment_72543\" aria-describedby=\"caption-attachment-72543\" style=\"width: 1500px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/query-monitor.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72543 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/query-monitor.jpg\" alt=\"Query Monitor WordPress plugin\" width=\"1500\" height=\"500\"><\/a><figcaption id=\"caption-attachment-72543\" class=\"wp-caption-text\">Query Monitor WordPress plugin<\/figcaption><\/figure>\n<p>A diferencia de Debug Bar no tienes que instalar ning\u00fan complemento para ver las acciones y los filtros que se activan en una p\u00e1gina determinada.<\/p>\n<figure id=\"attachment_72267\" aria-describedby=\"caption-attachment-72267\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72267 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/query-monitor-barra-de-administration.png\" alt=\"Puedes acceder al Query Monitor desde la barra de administraci\u00f3n\" width=\"1100\" height=\"438\"><figcaption id=\"caption-attachment-72267\" class=\"wp-caption-text\">Puedes acceder al Query Monitor desde la barra de administraci\u00f3n<\/figcaption><\/figure>\n<p>El Query Monitor tambi\u00e9n te da m\u00e1s informaci\u00f3n acerca de d\u00f3nde exactamente se dispara un gancho.<\/p>\n<figure id=\"attachment_72266\" aria-describedby=\"caption-attachment-72266\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72266 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/query-monitor-hooks-and-actions.png\" alt=\"El panel Hooks &amp; Actions en Query Monitor\" width=\"1100\" height=\"642\"><figcaption id=\"caption-attachment-72266\" class=\"wp-caption-text\">El panel Hooks &#038; Actions en Query Monitor<\/figcaption><\/figure>\n<p>En la columna de componentes, se puede ver que la mayor\u00eda de los ganchos est\u00e1n registrados desde el n\u00facleo. Pero algunos ganchos se registran desde un tema o un plugin. Algunos ganchos pueden estar registrados desde m\u00e1s de un componente.<\/p>\n<p>Puedes usar los <a href=\"https:\/\/kinsta.com\/es\/blog\/menu-desplegable-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">desplegables<\/a> de ganchos y componentes para ver s\u00f3lo los ganchos que necesitas.<\/p>\n<p><strong>Nota:<\/strong> Query Monitor utiliza \u00abGanchos\u00bb como t\u00e9rmino general tanto para las acciones como para los filtros, pero llama a las funciones de callback registradas como \u00abAcciones\u00bb. Esta es t\u00e9cnicamente una definici\u00f3n err\u00f3nea y puede confundirte, as\u00ed que tenlo en cuenta.<\/p>\n<p>Puedes hacer m\u00e1s que comprobar todas las consultas y peticiones con Query Monitor. Tambi\u00e9n incluye caracter\u00edsticas avanzadas como estilos de listado, scripts, <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-multilingue\/\" target=\"_blank\" rel=\"noopener noreferrer\">lenguajes<\/a>, <a href=\"https:\/\/kinsta.com\/es\/blog\/admin-ajax\/\" target=\"_blank\" rel=\"noopener noreferrer\">llamadas Ajax<\/a>, comprobaciones de capacidad de usuario y <a href=\"https:\/\/kinsta.com\/es\/blog\/rest-api-de-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">llamadas a la API de REST<\/a>.<\/p>\n<h2>\u00aball\u00bb Hook<\/h2>\n<p>WordPress tiene <a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/advanced-topics\/#debugging-with-the-all-hook\" target=\"_blank\" rel=\"noopener noreferrer\">un gancho especial llamado \u00aball\u00bb<\/a> que puedes enganchar para ejecutar una funci\u00f3n de callback para cada uno de los ganchos, independientemente de si est\u00e1 registrado en todos ellos. Es \u00fatil para depurar <a href=\"https:\/\/kinsta.com\/es\/blog\/depuracion-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">fallos de p\u00e1gina<\/a> o si quieres saber cuando un evento en particular est\u00e1 sucediendo.<\/p>\n<p>Por ejemplo, puedes usar el gancho <strong>all<\/strong> como en el ejemplo de abajo para hacer eco <strong>de<\/strong> todas las acciones que se est\u00e1n ejecutando.<\/p>\n<pre><code class=\"language-php\">\/\/ echo all the actions being run\nfunction debug_helper_function(){\n\u00a0 \u00a0 echo '&lt;p&gt;' . current_action() . '&lt;\/p&gt;';\n}\nadd_action( 'all', 'debug_helper_function' );<\/code><\/pre>\n<p>La <strong><code>debug_helper_function()<\/code><\/strong> definida anteriormente se ejecutar\u00e1 cuando se dispare cualquier acci\u00f3n. Saber cu\u00e1l fue la \u00faltima acci\u00f3n ejecutada te dar\u00e1 una mejor idea de d\u00f3nde tienes que buscar.<\/p>\n<h2>\u00bfD\u00f3nde se guardan los ganchos de WordPress?<\/h2>\n<p>WordPress usa la clase <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_hook\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP_Hook<\/a> para implementar c\u00f3mo funcionan los ganchos. Esta clase central se usa para manejar todas las acciones y filtros de WordPress incorporados. Puedes encontrar casi todo el c\u00f3digo relacionado con esta clase en el archivo <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/class-wp-hook.php\" target=\"_blank\" rel=\"noopener noreferrer\">wp-includes\/class-wp-hook.php.<\/a><\/p>\n<p>T\u00e9cnicamente, la clase <strong><code>WP_Hook<\/code><\/strong> es un arreglo de objetos que comprende propiedades como callbacks, iteraciones, current_priority, nesting_level, y doing_action. Tambi\u00e9n define un mont\u00f3n de \u00fatiles funciones gancho que pueden ser llamadas usando los <a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-hook.php\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9todos WP_Hook<\/a>.<\/p>\n<p>La mayor\u00eda de los desarrolladores de WordPress no tienen que preocuparse mucho por d\u00f3nde almacena WordPress los ganchos siempre que se atengan a las directrices de la API de los plugins.<\/p>\n\n<h2>\u00bfC\u00f3mo crear tus ganchos personalizados de WordPress?<\/h2>\n<p>Has visto los diversos ganchos que WordPress proporciona a trav\u00e9s de su Plugin API. Tambi\u00e9n has visto c\u00f3mo puedes usar los ganchos predeterminados para inyectar tu propio c\u00f3digo en el tiempo de ejecuci\u00f3n de WordPress.<\/p>\n<p>Si eres un <a href=\"https:\/\/kinsta.com\/es\/blog\/salario-desarrollador-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">desarrollador de plugins o de temas<\/a>, es una buena pr\u00e1ctica proporcionar a otros desarrolladores una forma de interactuar con tu c\u00f3digo de la misma manera. Los ganchos personalizados te permiten hacer exactamente eso. Permiten a otros desarrolladores ampliar y modificar la funcionalidad de tus plugins y temas.<\/p>\n<p>Crear tus propias acciones y filtros es bastante simple. Utilizas las mismas funciones que usa WordPress Core para crear ganchos. Veamos algunos ejemplos.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"6\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>\u00bfC\u00f3mo crear acciones personalizadas en WordPress?<\/h3>\n<p>Utiliza la funci\u00f3n<strong><code>do_action()<\/code><\/strong> para crear un gancho de acci\u00f3n personalizado. As\u00ed es como se hace:<\/p>\n<pre><code class=\"language-php\">\/\/ the position where you insert your action is where it'll run when called\ndo_action( ' my_unique_custom_action' );\n\/\/ continue with the rest of your code<\/code><\/pre>\n<p>Ahora, otros desarrolladores pueden engancharse a tu plugin o tema sin modificar el c\u00f3digo fuente. Todo lo que tienen que hacer es registrar sus funciones de callback a la acci\u00f3n personalizada de tu plugin usando la funci\u00f3n <strong><code>add_action()<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">add_action( 'my_unique_custom_action', 'some_callback_function' );\n\n\/\/ define the callback function you mentioned in the above action function\nsome_callback_function() {\n     \/\/ this code will run wherever your custom action hook is \n}<\/code><\/pre>\n<p>Aseg\u00farate de <strong>documentar<\/strong> bien tus ganchos personalizados, explicando en detalle lo que hacen. Despu\u00e9s de todo, el uso principal de la creaci\u00f3n de ganchos personalizados es ayudar a <a href=\"https:\/\/kinsta.com\/es\/blog\/salario-desarrollador-web\/\" target=\"_blank\" rel=\"noopener noreferrer\">otros desarrolladores a<\/a> interactuar con tu c\u00f3digo.<\/p>\n<h3>\u00bfC\u00f3mo crear un filtro personalizado en WordPress?<\/h3>\n<p>Utiliza la funci\u00f3n<strong><code>apply_filters()<\/code><\/strong> para crear un gancho de filtro personalizado. As\u00ed es como puedes hacerlo:<\/p>\n<pre><code class=\"language-php\">$value_to_filter = \"I'm a string, but this can be any PHP data type\";\n\n\/\/ filters modify a value and are typically tied to a predefined variable\napply_filters( 'my_custom_filter', $value_to_filter );<\/code><\/pre>\n<p>Los par\u00e1metros de tu filtro personalizado deben incluir un identificador \u00fanico y un valor a filtrar. Otros desarrolladores pueden engancharse a tu filtro personalizado con la funci\u00f3n <strong><code>add_filter()<\/code><\/strong> y modificar el valor pasado.<\/p>\n<pre><code class=\"language-php\">add_filter( 'my_custom_filter', 'some_callback_function' );\n\n\/\/ define the callback function you mentioned in the above filter function\nfunction some_callback_function( $value_to_filter ) {\n    \/\/ modify the passed value (or not) \n    return $value_to_filter; \/\/ returning a value is a must for filters\n}<\/code><\/pre>\n<p>Cuando definas tu filtro personalizado, aseg\u00farate de que no se posicione antes de que se defina el valor que se supone que debe filtrar. Si no posiciona el filtro correctamente, el valor filtrado ser\u00e1 sobrescrito por el valor predeterminado despu\u00e9s.<\/p>\n<h3>Convenci\u00f3n sobre la denominaci\u00f3n de los ganchos personalizados<\/h3>\n<p>Es importante elegir un nombre \u00fanico para todos sus ganchos personalizados. Dado que cualquier plugin o tema puede tener sus propios ganchos personalizados, tener nombres de ganchos id\u00e9nticos puede causar colisiones de c\u00f3digos con resultados inesperados.<\/p>\n<p>Por ejemplo, si llamas a tu acci\u00f3n <strong><code>send_email<\/code><\/strong>, es muy probable que otros desarrolladores de plugins tambi\u00e9n escojan el mismo t\u00e9rmino ya que no es lo suficientemente \u00fanico. Si un sitio web instala tanto los plugins suyos como los de otros desarrolladores, puede <a href=\"https:\/\/kinsta.com\/es\/blog\/errores-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">causar errores que ser\u00e1n dif\u00edciles de rastrear<\/a>.<\/p>\n<p>Puedes ponerle un prefijo a todos tus anzuelos personalizados con un identificador com\u00fan para que sean simples y \u00fanicos. As\u00ed, en lugar de <strong><code>send_email<\/code><\/strong>, puedes nombrarlo <strong><code>plugin_name_send_email<\/code><\/strong> (<strong>plugin_name_<\/strong> es el prefijo \u00fanico aqu\u00ed).<\/p>\n<h3>Demostraci\u00f3n de Custom Hooks con un plugin extensible<\/h3>\n<p>Vamos a crear un plugin extensible (o un plugin enchufable) que permita a otros desarrolladores interactuar con \u00e9l usando sus ganchos personalizados.<\/p>\n<p>Nombrar\u00e9 a este plugin \u00ab<strong>Custom Hooks Demo\u00bb<\/strong>. Su funci\u00f3n principal es producir un cuadro de citas dondequiera que se inserte un atajo. Incluir\u00e1 acciones y filtros personalizados en los lugares adecuados para que otros desarrolladores puedan modificar o ampliar su funcionalidad.<\/p>\n<p>Puedes consultar mi <a href=\"https:\/\/kinsta.com\/es\/blog\/codigos-cortos-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">gu\u00eda de atajos de WordPress<\/a> para saber m\u00e1s sobre c\u00f3mo funcionan los atajos.<\/p>\n<p>Empecemos con el plugin extensible.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name :  Custom Hooks Demo\nDescription :  Demonstrating how to create an extensible WordPress plugin using custom hooks.\nAuthor      :  Salman Ravoof\nAuthor URI  :  https:\/\/salmanravoof.com\/\nLicense     :  GPLv2 or later\nLicense URI :  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain :  custom-hooks-demo\n*\/\n\n\/** \n * the [custom_hooks_demo] shortcode returns the HTML code for a quote box.\n * @return string HTML code for a quote box\n*\/\nadd_shortcode( 'custom_hooks_demo', 'my_shortcode_callback' );\n\nfunction my_shortcode_callback ( $arguments ) {\n    ob_start(); \/\/ start object buffering to collect all output before sending it to the browser\n    \n    \/\/ set an action hook to run before you output anything\n    do_action( 'the_topmost_custom_action' );\n    \n    \/\/ define your variables which you want to allow to be filtered\n    $quote_content = \"Z.E.R.O. That's the number of people who'd like to have any website autoplay music on their browsers.\";\n    $quote_author = \"John Doenuts\";\n    \n    \/\/ create your custom filters after you've set the variables\n    $quote_content = apply_filters( 'custom_quote_content', $quote_content );\n    $quote_author = apply_filters( 'custom_quote_author', $quote_author );\n    \n    \/\/ build the shortcode output template\n    echo \"&lt;div style=\\\"border:3px solid #5333ed;\\\"&gt;&lt;blockquote style=\\\"margin:20px;border-color:#5333ed;\\\"&gt;\";\n    echo $quote_content;\n    echo \"&lt;br&gt;&lt;br&gt;\";\n    echo \"\u2015 &lt;strong&gt;\" . $quote_author . \"&lt;\/strong&gt;\";\n    echo \"&lt;\/blockquote&gt;&lt;\/div&gt;\";\n    \n    \/\/ set an action hook to run after you output everything\n    do_action( 'the_ending_custom_action' );\n    \n    return ob_get_clean(); \/\/ get buffer contents, delete the buffer, and then stop buffering\n}<\/code><\/pre>\n<ul>\n<li>La funci\u00f3n <strong><code>add_shortcode()<\/code><\/strong> se utiliza para crear el c\u00f3digo corto personalizado. Y luego se define la funci\u00f3n de callback del atajo con toda la funcionalidad de este plugin.<\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.ob-start.php\" target=\"_blank\" rel=\"noopener noreferrer\">ob_start()<\/a> es una funci\u00f3n de PHP que permite el almacenamiento temporal de la salida. Es una funci\u00f3n s\u00faper \u00fatil que le indica a PHP que mantenga cualquier salida en la memoria del buffer del servidor en lugar de emitirla de inmediato. Puede usarse para construir c\u00f3digo HTML complejo y legible en PHP.<\/li>\n<li><strong><code>do_action( 'the_topmost_custom_action' )<\/code><\/strong> define tu primera acci\u00f3n personalizada. Para que sea \u00fatil, tienes que definirla antes de que el plugin d\u00e9 salida a algo. Otros desarrolladores pueden engancharse a esta acci\u00f3n personalizada para ejecutar su c\u00f3digo antes de que este atajo personalizado imprima algo.<\/li>\n<li>Crea las variables que quieres filtrar. En este plugin, esas variables son<strong><code>$quote_content<\/code><\/strong> y <strong>$quote_author<\/strong>. Ambas son cadenas en este ejemplo, pero puedes configurarlas para que sean cualquier tipo de datos PHP (por ejemplo, entero, booleano, matriz).<\/li>\n<li>Utiliza la funci\u00f3n <strong><code>apply_filters()<\/code><\/strong> para crear tus filtros personalizados. Dado que todos los filtros devuelven un valor, puedes asignar las variables previamente definidas al valor devuelto por este filtro. Otros desarrolladores pueden ahora engancharse a este filtro para modificar los valores predeterminados de las variables predefinidas.<\/li>\n<li>Usa declaracionesde <strong><code>echo<\/code><\/strong> para construir la salida de tu atajo l\u00ednea por l\u00ednea. Como hemos habilitado el b\u00fafer de salida, ninguna salida llegar\u00e1 al navegador de inmediato.<\/li>\n<li><strong><code>do_action( 'the_ending_custom_action' )<\/code><\/strong> define tu \u00faltima acci\u00f3n personalizada. Necesitas definirla al final, pero antes de devolver todo el contenido del buffer.<\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.ob-get-clean.php\">ob_get_clean()<\/a> es una funci\u00f3n PHP 3-en-1 por defecto. Recuperar\u00e1 el contenido del buffer, eliminar\u00e1 todos los datos del buffer, y luego detendr\u00e1 el buffer de salida. <strong><code>return<\/code><\/strong> el contenido del buffer recolectado como una sola cadena concatenada.<\/li>\n<\/ul>\n<p>Una vez guardado y activado, al a\u00f1adir el atajo <strong><code>[custom_hooks_demo]<\/code><\/strong> al contenido de la publicaci\u00f3n, aparecer\u00e1 un cuadro de citas con los valores predeterminados.<\/p>\n<figure id=\"attachment_72264\" aria-describedby=\"caption-attachment-72264\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72264 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/custom-hooks-demo.png\" alt=\"El cuadro de cotizaci\u00f3n original usando el plugin Custom Hooks Demo\" width=\"1100\" height=\"530\"><figcaption id=\"caption-attachment-72264\" class=\"wp-caption-text\">El cuadro de cotizaci\u00f3n original usando el plugin Custom Hooks Demo<\/figcaption><\/figure>\n<p>Ahora, vamos a crear otro plugin llamado <strong>Custom Hooks Demo Extension<\/strong>. Se enganchar\u00e1 a todos los ganchos personalizados creados por el plugin anterior y har\u00e1 o modificar\u00e1 algo.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name :  Custom Hooks Demo Extension\nDescription :  Demonstrating how you can extend WordPress plugin functionality with its custom hooks.\nAuthor      :  Salman Ravoof\nAuthor URI  :  https:\/\/salmanravoof.com\/\nLicense     :  GPLv2 or later\nLicense URI :  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain :  custom-hooks-demo-extension\n*\/\n\n\/**\n * replace the quote content by hooking into the 'custom_quote_content' filter\n*\/\nadd_filter( 'custom_quote_content', 'new_quote_content_callback' );\nfunction new_quote_content_callback( $content ) {\n    $content = \"There are no bugs in programming. Only unexpected features.\";\n    return $content;\n}\n\n\/**\n * replace the quote author by hooking into the 'custom_quote_author'\n*\/\nadd_filter( 'custom_quote_author', 'new_quote_author_callback' );\nfunction new_quote_author_callback( $author ) {\n    $author = \"Jane Doodle\";\n    return $author;\n}\n\n\/**\n * add an image to the top of the shortcode output by hooking into the 'the_topmost_custom_action'\n*\/\nadd_action( 'the_topmost_custom_action', 'quote_image_callback' );\nfunction quote_image_callback() {\n    $url = \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/f9\/Quote-right-cs.svg\/75px-Quote-right-cs.svg.png\";\n    echo '&lt;div&gt;&lt;img class=\"aligncenter\" src=\"'.$url.'\"&gt;&lt;\/div&gt;';\n}\n\n\/**\n * add a button below the shortcut output by hooking into the 'the_ending_custom_action'\n*\/\nadd_action( 'the_ending_custom_action', 'add_button_callback' );\nfunction add_button_callback() {\n    echo '&lt;div style=\"text-align:center;\"&gt;&lt;button name=\"nice\"&gt;Nice Quote!&lt;\/button&gt;&lt;\/div&gt;';\n}<\/code><\/pre>\n<p>Como puedes ver, este plugin de extensi\u00f3n no contiene nada m\u00e1s que funciones de acci\u00f3n y filtro que se enganchan en el plugin original en los lugares adecuados para hacer modificaciones.<\/p>\n<p>Utiliza las funciones <strong><code>add_action()<\/code><\/strong> y <strong><code>add_filter()<\/code><\/strong> para registrar sus funciones de callback con las acciones y filtros personalizados creados por el plugin original (por ejemplo, <strong><code>the_topmost_action<\/code><\/strong>, <strong><code>custom_quote_author<\/code><\/strong>).<\/p>\n<figure id=\"attachment_72262\" aria-describedby=\"caption-attachment-72262\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-72262\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/Modified-Quotation-Box-Custom-Hooks-Demo.png\" alt=\"The modified quotation box after the extension plugin changes the original output\" width=\"1100\" height=\"682\"><figcaption id=\"caption-attachment-72262\" class=\"wp-caption-text\">The extension plugin modifies the original quotation box<\/figcaption><\/figure>\n<p>Los ganchos de acci\u00f3n personalizados te permiten interponer tu c\u00f3digo en los intervalos correctos en el plugin original y ejecutar tus propios guiones. Aqu\u00ed, estamos <a href=\"https:\/\/kinsta.com\/es\/blog\/estrategia-contenido-visual\/\" target=\"_blank\" rel=\"noopener noreferrer\">a\u00f1adiendo una imagen<\/a> en la parte superior y un bot\u00f3n en la parte inferior.<\/p>\n<p>Asimismo, los ganchos de filtro personalizados permiten modificar los valores del contenido de la cita y su nombre de autor. El resultado final es un plugin que es completamente extensible por cualquiera sin modificar su c\u00f3digo fuente.<\/p>\n<h3>Trabajando con ganchos personalizados de desarrolladores de terceros<\/h3>\n<p>Los ganchos personalizados permiten que los <a href=\"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">plugins<\/a> y <a href=\"https:\/\/kinsta.com\/es\/blog\/temas-wordpress-rapidos\/\" target=\"_blank\" rel=\"noopener noreferrer\">temas<\/a> individuales de <a href=\"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a> tengan un rico ecosistema de plugins extensibles. Considere el plugin WooCommerce. A\u00f1ade funcionalidad de comercio electr\u00f3nico a WordPress, pero tambi\u00e9n incluye <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/hook-docs.html\" target=\"_blank\" rel=\"noopener noreferrer\">toneladas de ganchos dentro de su c\u00f3digo<\/a>.<\/p>\n<figure id=\"attachment_72270\" aria-describedby=\"caption-attachment-72270\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72270 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/accion-de-woocommerce.png\" alt=\"Acci\u00f3n de WooCommerce y referencia del gancho de filtro\" width=\"1100\" height=\"562\"><figcaption id=\"caption-attachment-72270\" class=\"wp-caption-text\">Acci\u00f3n de WooCommerce y referencia del gancho de filtro<\/figcaption><\/figure>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-de-ecommerce\/\" target=\"_blank\" rel=\"noopener noreferrer\">WooCommerce tiene cientos de extensiones<\/a> y <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-de-woocommerce\/\" target=\"_blank\" rel=\"noopener noreferrer\">plugins<\/a> que usan sus ganchos para construir su funcionalidad principal y hacerla a\u00fan mejor.<\/p>\n<p>Puedes usar estas extensiones para integrar WooCommerce con Stripe, MailChimp, Salesforce, Zapier, y mucho m\u00e1s.<\/p>\n<figure id=\"attachment_72269\" aria-describedby=\"caption-attachment-72269\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72269 size-full\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/woocommerce-extensiones.png\" alt=\"Las extensiones ampl\u00edan la funcionalidad de WooCommerce\" width=\"1100\" height=\"728\"><figcaption id=\"caption-attachment-72269\" class=\"wp-caption-text\">Las extensiones ampl\u00edan la funcionalidad de WooCommerce<\/figcaption><\/figure>\n<p>Una buena pr\u00e1ctica es revisar la secci\u00f3n de documentaci\u00f3n de los populares plugins de WordPress para ver c\u00f3mo implementan los ganchos personalizados. Algunas de mis principales sugerencias son <a href=\"https:\/\/docs.easydigitaldownloads.com\/article\/559-developers-intro-to-easy-digital-downloads\" target=\"_blank\" rel=\"noopener noreferrer\">Easy Digital Downloads<\/a>, <a href=\"https:\/\/codex.buddypress.org\/developer\/buddypress-hooks-actions-filters\/\" target=\"_blank\" rel=\"noopener noreferrer\">BuddyPress<\/a>, <a href=\"https:\/\/quizandsurveymaster.com\/docs\/developer\/hooks-and-filters\/\" target=\"_blank\" rel=\"noopener noreferrer\">Quiz y Survey Master<\/a>, y <a href=\"https:\/\/docs.gravityforms.com\/category\/developers\/hooks\/\" target=\"_blank\" rel=\"noopener noreferrer\">Gravity Forms<\/a>.<\/p>\n<h3>\u00bfCu\u00e1ndo usar los ganchos personalizados?<\/h3>\n<p>Dependiendo del <a href=\"https:\/\/kinsta.com\/es\/blog\/themeforest-pros-contras\/\" target=\"_blank\" rel=\"noopener noreferrer\">tema<\/a> o <a href=\"https:\/\/kinsta.com\/es\/blog\/directorio-de-plugins-de-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">plugin que est\u00e9s creando<\/a>, y para qui\u00e9n est\u00e9 destinado, puede que te preguntes si necesitas a\u00f1adir alg\u00fan gancho personalizado.<\/p>\n<p>Una buena regla emp\u00edrica a la hora de decidir si se a\u00f1aden o no ganchos personalizados es comprobar si ofrecen alg\u00fan beneficio de extensibilidad a otros desarrolladores. Si no es as\u00ed, es mejor esperar hasta que otros desarrolladores le pidan que los a\u00f1ada.<\/p>\n<p>Tienes que estar muy seguro de a\u00f1adir ganchos personalizados a tu plugin o tema. Una vez que se publica, y si otros desarrolladores ya lo han usado, no puedes cambiarlo sin romper la compatibilidad retroactiva.<\/p>\n<h2>Eliminar las funciones de callback de los ganchos de WordPress<\/h2>\n<p>Ya has visto ejemplos de c\u00f3mo eliminar las funciones de callback registradas en ciertos ganchos. Estas callbacks pueden ser registradas por plugins, temas, o incluso el propio WordPress Core. Veamos la eliminaci\u00f3n de las funciones de devoluci\u00f3n de llamada de ganchos con m\u00e1s ejemplos.<\/p>\n<p>Para eliminar una funci\u00f3n de callback de un gancho, dependiendo de si est\u00e1 registrada en una acci\u00f3n o en un filtro, es necesario utilizar las funciones <strong><code>remove_action()<\/code><\/strong> o <strong><code>remove_filter()<\/code><\/strong>.<\/p>\n<p>Una advertencia es que hay que llamar a estas funciones con los mismos par\u00e1metros utilizados para registrar la funci\u00f3n de callback. B\u00e1sicamente, copiar-pegar los par\u00e1metros de sus funciones <strong><code>add_action()<\/code><\/strong> o <strong><code>add_filter()<\/code><\/strong>.<\/p>\n<p>Adem\u00e1s, puedes eliminar las funciones de callback s\u00f3lo despu\u00e9s de que se registren. Si intentas eliminarlas antes de que se registren, el proceso de eliminaci\u00f3n fallar\u00e1. Necesitas conseguir la orden de ejecuci\u00f3n de los ganchos correctamente.<\/p>\n<p>Digamos que quieres eliminar una funci\u00f3n de callback registrada por un tema que a\u00f1ade hinchaz\u00f3n a tu sitio (<a href=\"https:\/\/kinsta.com\/es\/aprender\/acelerar-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">quieres un sitio r\u00e1pdo \u00bfverdad?<\/a>).<\/p>\n<pre><code class=\"language-php\">function wp_bloated_callback_function() {\u00a0 \u00a0 \n\/\/ some code that adds a lot of bloat to the site\n}\nadd_action( 'template_redirect', 'wp_bloated_callback_function', 5 );<\/code><\/pre>\n<p>Por ejemplo, la funci\u00f3n de callback anterior podr\u00eda cargar muchos guiones y hojas de estilo innecesarios. Eliminarla te dar\u00e1 a tu sitio un enorme <a href=\"https:\/\/kinsta.com\/es\/aprender\/optimizacion-de-velocidad-del-sitio\/\" target=\"_blank\" rel=\"noopener noreferrer\">impulso de rendimiento<\/a>.<\/p>\n<p>Sin embargo, es necesario asegurarse de que la funci\u00f3n <strong><code>remove_action()<\/code><\/strong> se ejecuta s\u00f3lo despu\u00e9s de la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/template_redirect\/\" target=\"_blank\" rel=\"noopener noreferrer\">template_redirect<\/a>. Una forma de hacer esto es engancharse a la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/after_setup_theme\/\" target=\"_blank\" rel=\"noopener noreferrer\">after_setup_theme<\/a> como se activa despu\u00e9s de la acci\u00f3n <strong><code>template_redirect<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">function wp_remove_bloat() {\n    \/\/ ensure all parameters are identical to the original add_action() function\n  \u00a0 remove_action( 'template_redirect', 'wp_bloated_callback_function', 5 );\n}\n\n\/\/ ensure that remove_action() is called only after add_action()\nadd_action( 'after_setup_theme', 'wp_remove_bloat' );<\/code><\/pre>\n<p>La <strong><code>wp_bloated_callback_function()<\/code><\/strong> se desenganchar\u00e1 ahora de la acci\u00f3n <strong><code>template_redirect<\/code><\/strong>.<\/p>\n<h3>Casos especiales para eliminar las funciones de callback<\/h3>\n<p>Hay m\u00e1s en la eliminaci\u00f3n de las funciones de callback que en su desactivaci\u00f3n total. A veces puede que necesites eliminarlas temporalmente, ejecutar tu c\u00f3digo y luego volver a a\u00f1adirlas.<\/p>\n<p>Por ejemplo, la acci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/save_post\/\" target=\"_blank\" rel=\"noopener noreferrer\">save_post<\/a> se dispara cada vez que se llaman las funciones <strong><code>wp_insert_post()<\/code><\/strong> y <strong><code>wp_publish_post()<\/code><\/strong>. Puedes <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/post.php#L4135\" target=\"_blank\" rel=\"noopener noreferrer\">encontrarlas ambas definidas<\/a> en el archivo <strong><code>wp-includes\/post.php<\/code><\/strong>.<\/p>\n<p>Por lo tanto, si tienes una funci\u00f3n de callback enganchada a la acci\u00f3n <strong><code>save_post<\/code><\/strong>, y si llamas a las funciones <strong><code>wp_insert_post()<\/code><\/strong> o <strong><code>wp_publish_post()<\/code><\/strong> dentro de tu funci\u00f3n de callback, la acci\u00f3n <strong><code>save_post<\/code><\/strong> se disparar\u00e1 varias veces.<\/p>\n<pre><code class=\"language-php\">function some_callback_function( $post_id, $post ) {\n\u00a0 \u00a0 \/\/ do something here\n  \u00a0 wp_insert_post( [some_array] ); \/\/ this function also calls the 'save_post' action\n\u00a0 \u00a0 \/\/ maybe do something more\n}\nadd_action( 'save_post', 'some_callback_function', 10, 2 );<\/code><\/pre>\n<p>Una funci\u00f3n que llama a la acci\u00f3n que tambi\u00e9n la llama puede crear resultados inesperados. Una forma de evitar este problema es usar la funci\u00f3n <strong><code>remove_action()<\/code><\/strong> dentro de la funci\u00f3n de llamada antes de llamar a <strong><code>wp_insert_post()<\/code><\/strong>.<\/p>\n<pre><code class=\"language-php\">function some_callback_function( $post_id, $post ) {\n\u00a0 \u00a0 \/\/ do something here\n\u00a0 \u00a0 \n    \/\/ remove the callback function from the \u2018save_post\u2019 action\n\u00a0 \u00a0 remove_action( 'save_post', 'some_callback_function', 10, 2 );\n\u00a0 \u00a0 \n    \/\/ now run the wp_insert_post() function\n    wp_insert_post( [some_array] );\n\u00a0 \u00a0 \n    \/\/ add the callback function back to the \u2018save_post\u2019 action\n\u00a0 \u00a0 add_action( 'save_post', 'some_callback_function', 10, 2 );\n\u00a0 \u00a0 \n    \/\/ maybe do something more\n}\nadd_action( 'save_post', 'some_callback_function', 10, 2 );<\/code><\/pre>\n<p>Ese es otro uso pr\u00e1ctico de las funciones <strong><code>remove_action()<\/code><\/strong> o <strong><code>remove_filter()<\/code><\/strong>. Profundizar en el n\u00facleo de WordPress te ayudar\u00e1 a entender c\u00f3mo puedes evitar mejor estas situaciones.<\/p>\n<h2>Tutoriales adicionales de WordPress Hooks<\/h2>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/agregar-codigo\/#how-to-manually-add-code-to-wordpress-header-and-footer\" target=\"_blank\" rel=\"noopener noreferrer\">A\u00f1adir manualmente el c\u00f3digo al encabezado y pie de p\u00e1gina de WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/biblioteca-multimedia-wordpress\/\" target=\"_blank\" rel=\"noopener noreferrer\">Tu gu\u00eda completa de la biblioteca multimedia de WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-cron-jobs\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00bfC\u00f3mo crear y modificar un trabajo de WordPress Cron?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-cron-jobs\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00bf<\/a><a href=\"https:\/\/kinsta.com\/es\/blog\/temas-child-wordpress\/#create\" target=\"_blank\" rel=\"noopener noreferrer\">C\u00f3mo crear un tema para ni\u00f1os de WordPress?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/deshabilitar-wordpress-plugins\/\" target=\"_blank\" rel=\"noopener noreferrer\">Deshabilitar los plugins de WordPress para que no se carguen en p\u00e1ginas y mensajes espec\u00edficos<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/desactivar-emojis-wordpress\/#2-disable-emojis-in-wordpress-with-code\" target=\"_blank\" rel=\"noopener noreferrer\">Deshabilitar los emojis en WordPress con c\u00f3digo<\/a><\/li>\n<\/ul>\n\n<h2>Resumen<\/h2>\n<p>Hay m\u00faltiples ventajas de usar ganchos de WordPress si eres un <a href=\"https:\/\/kinsta.com\/es\/blog\/wordcamp-europa\/\" target=\"_blank\" rel=\"noopener noreferrer\">desarrollador de WordPress<\/a>.<\/p>\n<p>Los ganchos no s\u00f3lo te permiten modificar o ampliar la funcionalidad b\u00e1sica de WordPress, sino que tambi\u00e9n puedes usarlos para modificar plugins, temas y permitir que otros desarrolladores interact\u00faen con tus plugins o temas.<\/p>\n<p>\u00a1Es hora de engancharse a los ganchos de WordPress!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los ganchos de WordPress son una de las herramientas m\u00e1s importantes para tener en el arsenal de un desarrollador de WordPress. Son la base del desarrollo &#8230;<\/p>\n","protected":false},"author":117,"featured_media":33787,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[414,729],"topic":[1345,1316],"class_list":["post-33694","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-webdev","tag-wordpress-hooks","topic-desarrollo-wordpress","topic-funcion-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WordPress Hooks: acciones, filtros y ganchos personalizados<\/title>\n<meta name=\"description\" content=\"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?\" \/>\n<meta property=\"og:description\" content=\"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-30T10:00:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-23T15:28:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"61 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?\",\"datePublished\":\"2020-05-30T10:00:50+00:00\",\"dateModified\":\"2023-08-23T15:28:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\"},\"wordCount\":11565,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg\",\"keywords\":[\"webdev\",\"WordPress Hooks\"],\"articleSection\":[\"Desarrollo de WordPress\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\",\"name\":\"WordPress Hooks: acciones, filtros y ganchos personalizados\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg\",\"datePublished\":\"2020-05-30T10:00:50+00:00\",\"dateModified\":\"2023-08-23T15:28:41+00:00\",\"description\":\"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg\",\"width\":1024,\"height\":512,\"caption\":\"WordPress Hooks\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desarrollo WordPress\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/desarrollo-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"WordPress Hooks: acciones, filtros y ganchos personalizados","description":"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/","og_locale":"es_ES","og_type":"article","og_title":"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?","og_description":"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!","og_url":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2020-05-30T10:00:50+00:00","article_modified_time":"2023-08-23T15:28:41+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Salman Ravoof","Tiempo de lectura":"61 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?","datePublished":"2020-05-30T10:00:50+00:00","dateModified":"2023-08-23T15:28:41+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/"},"wordCount":11565,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg","keywords":["webdev","WordPress Hooks"],"articleSection":["Desarrollo de WordPress"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/","url":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/","name":"WordPress Hooks: acciones, filtros y ganchos personalizados","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg","datePublished":"2020-05-30T10:00:50+00:00","dateModified":"2023-08-23T15:28:41+00:00","description":"Domina las acciones, los filtros y los ganchos personalizados creando tu propio plugin extensible. Mejora tus habilidades de desarrollo de WordPress ahora!","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/wordpress-hooks.jpg","width":1024,"height":512,"caption":"WordPress Hooks"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Desarrollo WordPress","item":"https:\/\/kinsta.com\/es\/secciones\/desarrollo-wordpress\/"},{"@type":"ListItem","position":3,"name":"Entrenamiento de WordPress Hooks: \u00bfC\u00f3mo usar acciones, filtros y ganchos personalizados?"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/33694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=33694"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/33694\/revisions"}],"predecessor-version":[{"id":63461,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/33694\/revisions\/63461"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/nl"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/translations\/se"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33694\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/33787"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=33694"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=33694"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=33694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}