{"id":233473,"date":"2023-02-15T13:19:00","date_gmt":"2023-02-15T10:19:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233473"},"modified":"2022-11-10T23:53:16","modified_gmt":"2022-11-10T20:53:16","slug":"como-agregar-configuraciones-personalizadas-a-un-widget-existente-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-agregar-configuraciones-personalizadas-a-un-widget-existente-en-wordpress\/","title":{"rendered":"C\u00f3mo agregar configuraciones personalizadas a un widget existente en WordPress"},"content":{"rendered":"\n<p>En esta publicaci\u00f3n, aprenderemos c\u00f3mo agregar su HTML personalizado y configuraciones a cualquiera de los widgets est\u00e1ndar de WordPress u otros. Usando esa configuraci\u00f3n, aprenderemos diferentes trucos sobre c\u00f3mo manipular el comportamiento de los widgets en consecuencia.<\/p>\n<p>La primera parte; agregar y guardar sus configuraciones personalizadas es bastante f\u00e1cil. La segunda parte depende de lo que quieras hacer espec\u00edficamente y depende del widget que est\u00e9s manipulando. En este post he incluido dos ejemplos; omitir un widget dependiendo de una configuraci\u00f3n (para agregar configuraciones para controlar la visibilidad del widget en ciertos casos) y manipular los argumentos del men\u00fa del widget de navegaci\u00f3n de WordPress. El ejemplo dado para la segunda parte deber\u00eda darle una buena pista sobre c\u00f3mo puede manejar lo que quiere hacer.<\/p>\n<h2>Agregar configuraciones personalizadas a cualquier widget<\/h2>\n<p>Para agregar configuraciones personalizadas a los widgets existentes, usamos una acci\u00f3n llamada <code>[in_widget_form](https:\/\/developer.wordpress.org\/reference\/hooks\/in_widget_form\/)<\/code>. Esta acci\u00f3n se aplica a la <code>form()<\/code>funci\u00f3n de todos los widgets, que es la funci\u00f3n responsable de representar la parte administrativa del widget.<\/p>\n<p>Con ese filtro obtenemos tres par\u00e1metros pero en realidad solo nos interesa el primero y el tercero. La primera es la instancia del widget que usaremos para obtener los nombres e ID de campo adecuados y (opcionalmente) verificar a qu\u00e9 tipo de widget estamos enganchados. El tercer par\u00e1metro es una matriz de la configuraci\u00f3n guardada del widget, que debemos usar para verificar el estado guardado anterior de nuestra configuraci\u00f3n.<\/p>\n<p>El siguiente c\u00f3digo agregar\u00e1 una casilla de verificaci\u00f3n con el nombre de configuraci\u00f3n &#8216; <code>awp-custom-setting<\/code>&#8216;. Ajuste el nombre y el HTML a la entrada que necesita. Lo importante es usar <code>$widget-&gt;get_field_name()<\/code>para agregar ID y <code>name<\/code>atributos adecuados a todas sus entradas. El valor de sus entradas debe completarse con lo que se guard\u00f3 anteriormente, y eso es algo que encontrar\u00e1 en el par\u00e1metro <code>$instance<\/code>. Para las casillas de verificaci\u00f3n, puede usar la funci\u00f3n de WordPress <code>[checked](https:\/\/developer.wordpress.org\/reference\/functions\/checked\/)()<\/code>para generar el atributo marcado.<\/p>\n<pre><code>add_action('in_widget_form', function($widget, $return, $instance) {\n    ?&gt;\n    &lt;p&gt;\n        &lt;input type=\"checkbox\" class=\"checkbox\" name=\"&lt;?php echo $widget-&gt;get_field_name('awp-custom-setting'); ?&gt;\" id=\"&lt;?php echo $widget-&gt;get_field_name('awp-custom-setting'); ?&gt;\" &lt;?php checked(isset($instance['awp-custom-setting'])? $instance['awp-custom-setting']: 0); ?&gt; \/&gt;\n        &lt;label for=\"&lt;?php echo $widget-&gt;get_field_name('awp-custom-setting'); ?&gt;\"&gt;&lt;?php __('Activate something', 'txtdomain'); ?&gt;&lt;\/label&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}, 10, 3);<\/code><\/pre>\n<p>Despu\u00e9s de agregar esto al <code>functions.php<\/code>c\u00f3digo de su tema o complemento, todos los widgets ahora deber\u00edan tener una casilla de verificaci\u00f3n al final de su formulario en admin.<\/p>\n<h3>Apunta a widgets espec\u00edficos<\/h3>\n<p>Si desea aplicar su configuraci\u00f3n solo a uno o algunos widgets espec\u00edficos, puede comparar la propiedad <code>id_base<\/code>en el <code>$widget<\/code>objeto. Necesitar\u00e1 saber que la ID base es: si no est\u00e1 seguro, simplemente haga un <code>var_dump($widget-&gt;id_base)<\/code>clic dentro del enlace, guarde y verifique la salida para cada widget en el administrador. Por ejemplo, el widget de navegaci\u00f3n tiene la base <code>nav_menu<\/code>de ID y el widget de archivos tiene <code>archives<\/code>.<\/p>\n<p>En el siguiente ejemplo, comprobamos si el widget es un widget de navegaci\u00f3n. Si no es as\u00ed, la funci\u00f3n se cancela con un <code>return<\/code>. Solo los widgets de navegaci\u00f3n obtendr\u00e1n la casilla de verificaci\u00f3n personalizada:<\/p>\n<pre><code>add_action('in_widget_form', function($widget, $return, $instance) {\n    if ($widget-&gt;id_base != 'nav_menu') {\n        return;\n    }\n\u00a0\n    ?&gt;\n    &lt;p&gt;\n    ...<\/code><\/pre>\n<p>Deber\u00eda obtener la configuraci\u00f3n en admin as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153158-61e509045fded.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153158-61e509045fded.png\" alt=\"C\u00f3mo agregar configuraciones personalizadas a un widget existente en WordPress\" ><\/a><\/p>\n<p>Por lo tanto, la configuraci\u00f3n se ha agregado; sin embargo, en este momento no se est\u00e1n guardando sus configuraciones. Arreglemos eso.<\/p>\n<h2>Guardar su configuraci\u00f3n personalizada<\/h2>\n<p>Necesitamos conectarnos a la <code>update()<\/code>funci\u00f3n del widget para actualizar nuestra configuraci\u00f3n personalizada.<\/p>\n<p>Para ello utilizamos el filtro <code>[widget_update_callback](https:\/\/developer.wordpress.org\/reference\/hooks\/widget_update_callback\/)<\/code>. El proceso de guardar nuestra configuraci\u00f3n es exactamente como lo har\u00eda cuando escribe una clase de widget. El filtro proporciona tres par\u00e1metros; la primera es la matriz de instancias que se guardar\u00e1. El segundo par\u00e1metro es el estado que se ha publicado al guardar el widget y el tercero es el estado anterior. Necesitamos asegurarnos de obtener nuestros nuevos valores del segundo par\u00e1metro y agregarlos al primero.<\/p>\n<p>As\u00ed es como actualizar\u00edamos el estado de nuestra casilla de verificaci\u00f3n; como queremos guardar un valor <code>true<\/code>o <code>false<\/code>:<\/p>\n<pre><code>add_filter('widget_update_callback', function($instance, $new_instance, $old_instance) {\n    $instance['awp-custom-setting'] = isset($new_instance['awp-custom-setting']);\n    return $instance;\n}, 10, 3);<\/code><\/pre>\n<p>Recuerde ajustar los nombres de entrada a sus propios nombres de configuraci\u00f3n. Si est\u00e1 agregando varias entradas, debe repetir esto para cada una.<\/p>\n<p>\u00a1Ahora deber\u00eda ver que su configuraci\u00f3n personalizada se est\u00e1 guardando en el administrador!<\/p>\n<h2>Uso de configuraciones de widgets personalizadas guardadas<\/h2>\n<p>Como se mencion\u00f3 anteriormente, esta parte realmente depende de lo que desea que haga su configuraci\u00f3n. Desafortunadamente, no es tan sencillo porque la mayor\u00eda de los widgets no agregan filtros o ganchos en sus salidas. Comencemos con algo simple; evite renderizar el widget dependiendo de la configuraci\u00f3n.<\/p>\n<h3>Impedir el widget de renderizado seg\u00fan la configuraci\u00f3n personalizada<\/h3>\n<p>Digamos que est\u00e1 agregando configuraciones para cuando el widget deber\u00eda estar visible; por ejemplo, ocultarlo en ciertas plantillas (ocultar en la plantilla de resultados de b\u00fasqueda, pero mostrarlo en la p\u00e1gina principal y \u00fanico), o reaccionar a otros estados de WordPress.<\/p>\n<p>Para ello podemos utilizar el filtro <code>[widget_display_callback](https:\/\/developer.wordpress.org\/reference\/hooks\/widget_display_callback\/)<\/code>. Todo lo que tenemos que hacer es verificar el par\u00e1metro de instancia provisto para nuestra configuraci\u00f3n y regresar <code>false<\/code>si no queremos renderizar el widget.<\/p>\n<p>Este c\u00f3digo simple evitar\u00e1 renderizar el widget si la casilla de verificaci\u00f3n personalizada que agregamos arriba est\u00e1 marcada:<\/p>\n<pre><code>add_filter('widget_display_callback', function($instance, $widget, $args) {\n    if ($instance['awp-custom-setting']) {\n        return false;\n    }\n    return $instance;\n}, 10, 3);<\/code><\/pre>\n<p>Probablemente quieras comparar otros estados. Este es un ejemplo simple en el que nuestra casilla de verificaci\u00f3n es una casilla de verificaci\u00f3n para &quot;Ocultar en vistas de publicaciones individuales&quot;. Simplemente verificamos si actualmente estamos en una vista de publicaci\u00f3n \u00fanica <code>[is_singular](https:\/\/developer.wordpress.org\/reference\/functions\/is_singular\/)()<\/code>y, si la casilla de verificaci\u00f3n est\u00e1 marcada, devolvemos <code>false<\/code>.<\/p>\n<pre><code>add_filter('widget_display_callback', function($instance, $widget, $args) {\n    if (is_singular() &amp;&amp; $instance['awp-custom-setting']) {\n        return false;\n    }\n    return $instance;\n}, 10, 3);<\/code><\/pre>\n<h3>Modificar la configuraci\u00f3n o la salida del widget existente<\/h3>\n<p>Un filtro poderoso para utilizar para jugar con los widgets existentes es <code>[dynamic_sidebar_params](https:\/\/developer.wordpress.org\/reference\/hooks\/dynamic_sidebar_params\/)<\/code>. Eche un vistazo a la p\u00e1gina de documentaci\u00f3n para ver qu\u00e9 par\u00e1metros puede modificar. Por ejemplo, puede agregar clases personalizadas, puede modificar las cadenas <code>before_widget<\/code>, <code>after_widget<\/code>o <code>before_title<\/code>y <code>after_title<\/code>HTML. Sin embargo, esto se aplica a todos los widgets, tambi\u00e9n al administrador y al frontend. Y con este filtro no tiene acceso a la instancia del widget (configuraci\u00f3n guardada) ni a la configuraci\u00f3n del widget (por ejemplo, tipo de widget).<\/p>\n<p>Obviamente, necesitamos al menos verificar nuestra configuraci\u00f3n personalizada. Entonces, necesitamos hacer bastante c\u00f3digo para obtener los valores que necesitamos.<\/p>\n<p>Lo primero que podemos hacer es acceder a una variable global <code>$wp_registered_widgets<\/code>. Esta es una matriz que contiene todos los widgets disponibles registrados. Usando ese registro, podemos usar el par\u00e1metro del filtro para encontrar el widget espec\u00edfico en el que nos encontramos actualmente. Una vez que hemos encontrado el widget actual, tenemos acceso a los par\u00e1metros del widget, como <code>id_base<\/code>\u2013 que, como vimos anteriormente, nos dice el tipo de widget.<\/p>\n<pre><code>add_filter('dynamic_sidebar_params', function($params) {\n    global $wp_registered_widgets;\n\u00a0\n    $this_widget_id = $params[0]['widget_id'];  \/\/ Current widget ID\n    $this_widget = $wp_registered_widgets[$this_widget_id];\n    $widget_object = $this_widget['callback'][0];  \/\/ Current widget object\n\u00a0\n    \/\/ With $widget_object we have access to e.g. id_base for checking type of widget\n    if ($widget_object-&gt;id_base != 'nav_menu') {\n        return $params;\n    }\n\u00a0\n    return $params;\n});<\/code><\/pre>\n<p>Como puede ver en l\u00ednea <code>#9<\/code>, finalmente podemos verificar en qu\u00e9 tipo de widget nos encontramos actualmente. En el c\u00f3digo anterior, devuelvo si el tipo de widget no es un widget de navegaci\u00f3n, ya que nuestra configuraci\u00f3n personalizada solo se agreg\u00f3 para esos widgets.<\/p>\n<h3>Obtener la configuraci\u00f3n guardada del widget<\/h3>\n<p>Pero tambi\u00e9n necesitamos obtener la configuraci\u00f3n guardada por widget (incluida nuestra configuraci\u00f3n personalizada). Las configuraciones guardadas de todos los widgets se almacenan en la base de datos de opciones agrupadas por tipo de widget. Usando una propiedad en el registro de widgets, podemos usar <code>[get_option](https:\/\/developer.wordpress.org\/reference\/functions\/get_option\/)()<\/code>para obtener la configuraci\u00f3n guardada para el tipo de widget actual. El retorno ser\u00e1 una matriz indexada donde necesitamos usar otro par\u00e1metro m\u00e1s del filtro para encontrar el \u00edndice actual (porque puede agregar m\u00faltiples del mismo tipo de widget en las mismas barras laterales o en diferentes). Es m\u00e1s f\u00e1cil mostrar con c\u00f3digo que explicarlo:<\/p>\n<pre><code>    ...\n    if ($widget_object-&gt;id_base != 'nav_menu') {\n        return $params;\n    }\n\u00a0\n    $all_settings = get_option($widget_object-&gt;option_name);\n    $saved_settings = $all_settings[$params[1]['number']];\n    if ($saved_settings['my-custom-thing']) {\n        \/\/ Do your thing\n    }\n\u00a0\n    return $params;\n});<\/code><\/pre>\n<p>\u00a1Finalmente obtenemos las configuraciones guardadas del widget! En el c\u00f3digo de ejemplo anterior, en la l\u00ednea <code>#9<\/code>, verificamos si nuestra casilla de verificaci\u00f3n personalizada est\u00e1 marcada o no.<\/p>\n<h3>Ejemplos<\/h3>\n<p>En este punto, depende de ti lo que quieras hacer. Por ejemplo, puede generar una salida despu\u00e9s del t\u00edtulo del widget, pero antes del contenido del widget:<\/p>\n<pre><code>    ...\n    if ($saved_settings['my-custom-thing']) {\n        $params[0]['after_title'] .= '&lt;div&gt;This appears before widget content&lt;\/div&gt;';\n    }\n    ...<\/code><\/pre>\n<p>Para casos de uso m\u00e1s reales, normalmente resolver\u00eda la mayor\u00eda agregando ciertos filtros en este punto, llamando <code>add_filter()<\/code>en este punto.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de modificaci\u00f3n de los argumentos del men\u00fa de navegaci\u00f3n mediante la adici\u00f3n de un filtro si se marc\u00f3 nuestra configuraci\u00f3n. Si no estaba marcado, nos aseguramos de que se elimine el filtro. El filtro para modificar los argumentos para representar un men\u00fa de navegaci\u00f3n es <code>widget_nav_menu_args<\/code>. En el c\u00f3digo a continuaci\u00f3n, defin\u00ed una funci\u00f3n para aplicar a este filtro que agrega un nuevo argumento a los argumentos del men\u00fa; un caminante:<\/p>\n<pre><code>    ...\n    if ($saved_settings['my-custom-thing']) {\n        add_filter('widget_nav_menu_args', 'awp_add_menu_walker', 10, 3);\n    } else {\n        remove_filter('widget_nav_menu_args', 'awp_add_menu_walker', 10);\n    }\n    return $params;\n});\nfunction awp_add_menu_walker($nav_menu_args, $nav_menu, $args) {\n    $nav_menu_args['walker'] = new AWP_Custom_Walker();\n    return $nav_menu_args;\n}<\/code><\/pre>\n<p>El c\u00f3digo anterior es un ejemplo de un caso de uso en el que la casilla de verificaci\u00f3n personalizada controla si se aplica o no un caminante de men\u00fa al men\u00fa. Excelente si desea que todos los men\u00fas se muestren con normalidad, pero desea que la opci\u00f3n de widgets de men\u00fa espec\u00edficos se muestre de manera diferente. Lo que haga el andador con la salida del men\u00fa depende de usted.<\/p>\n<p>Consulte a continuaci\u00f3n el c\u00f3digo completo para agregar una configuraci\u00f3n personalizada a todos los men\u00fas de navegaci\u00f3n, actualizarla y aplicar un men\u00fa de navegaci\u00f3n.<\/p>\n<p>Esperemos que esto sea suficiente para que descubras c\u00f3mo codificar lo que quieres hacer. Realmente depende de lo que quieras hacer y con qu\u00e9 tipo de widget est\u00e9s trabajando. Como se mencion\u00f3 anteriormente, por lo general, la mayor\u00eda de las modificaciones se pueden resolver agregando filtros para hacer lo suyo en formato <code>dynamic_sidebar_params<\/code>.<\/p>\n<h2>Ejemplo completo: configuraci\u00f3n de casilla de verificaci\u00f3n personalizada en los widgets de navegaci\u00f3n para aplicar un caminante de men\u00fas<\/h2>\n<p>Aqu\u00ed est\u00e1 el c\u00f3digo completo para agregar una casilla de verificaci\u00f3n personalizada a todos los widgets del men\u00fa de navegaci\u00f3n de WordPress para usar un caminante de men\u00fa registrado. (C\u00f3digo de andador no incluido)<\/p>\n<pre><code>\/\/ Add custom setting to menu widgets\nadd_action('in_widget_form', function($widget, $return, $instance) {\n    \/\/ Add setting only to menu widgets\n    if ($widget-&gt;id_base != 'nav_menu') {\n        return;\n    }\n\u00a0\n    ?&gt;\n    &lt;p&gt;\n        &lt;input type=\"checkbox\" class=\"checkbox\" name=\"&lt;?php echo $widget-&gt;get_field_name('activate-walker'); ?&gt;\" id=\"&lt;?php echo $widget-&gt;get_field_name('activate-walker'); ?&gt;\" &lt;?php checked(isset($instance['activate-walker'])? $instance['activate-walker']: 0); ?&gt; \/&gt;\n        &lt;label for=\"&lt;?php echo $widget-&gt;get_field_name('activate-walker'); ?&gt;\"&gt;&lt;?php __('Activate walker', 'txtdomain'); ?&gt;&lt;\/label&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}, 10, 3);\n\u00a0\n\u00a0\n\/\/ Update custom setting\nadd_filter('widget_update_callback', function($instance, $new_instance, $old_instance) {\n    $instance['activate-walker'] = isset($new_instance['activate-walker']);\n    return $instance;\n}, 10, 3);\n\u00a0\n\u00a0\n\/\/ Filter sidebar params to add filter if custom setting was activated\nadd_filter('dynamic_sidebar_params', function($params) {\n    global $wp_registered_widgets;\n\u00a0\n    $this_widget_id = $params[0]['widget_id'];\n    $this_widget = $wp_registered_widgets[$this_widget_id];\n    $widget_object = $this_widget['callback'][0];\n\u00a0\n    \/\/ Bail if not a menu widget\n    if ($widget_object-&gt;id_base != 'nav_menu') {\n        return $params;\n    }\n\u00a0\n    $all_settings = get_option($widget_object-&gt;option_name);\n    $saved_settings = $all_settings[$params[1]['number']];\n\u00a0\n    if ($saved_settings['activate-walker']) {\n        add_filter('widget_nav_menu_args', 'awp_add_menu_walker', 10, 3);\n    } else {\n        remove_filter('widget_nav_menu_args', 'awp_add_menu_walker', 10);\n    }\n\u00a0\n    return $params;\n});\n\u00a0\n\u00a0\n\/\/ Filter nav menu arguments to add walker\nfunction awp_add_menu_walker($nav_menu_args, $nav_menu, $args) {\n    $nav_menu_args['walker'] = new AWP_Custom_Walker();\n    return $nav_menu_args;\n}<\/code><\/pre>\n<h2>Conclusi\u00f3n<\/h2>\n<p>\u00a1Espero que esta publicaci\u00f3n haya sido \u00fatil para resolver sus necesidades o darle algunos consejos sobre c\u00f3mo puede hacer lo que necesita hacer!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>C\u00f3mo agregar configuraciones personalizadas a cualquiera de los widgets est\u00e1ndar de WordPress. Con esta configuraci\u00f3n, aprenderemos c\u00f3mo manipular el comportamiento de los widgets en consecuencia.<\/p>\n","protected":false},"author":1,"featured_media":223663,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[924,892,892,716,716,831,1110,800,800,831,924,840,840,861,861],"tags":[1172],"class_list":["post-233473","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asignaturas","category-codigo","category-desarrollador","category-guia-para-principiantes","category-n-a","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233473"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233473\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223663"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}