{"id":233381,"date":"2023-02-13T17:23:00","date_gmt":"2023-02-13T14:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233381"},"modified":"2022-11-10T23:22:59","modified_gmt":"2022-11-10T20:22:59","slug":"tutorial-de-wordpress-menu-personalizado-para-publicaciones-o-paginas-en-la-barra-lateral","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/tutorial-de-wordpress-menu-personalizado-para-publicaciones-o-paginas-en-la-barra-lateral\/","title":{"rendered":"Tutorial de WordPress: men\u00fa personalizado para publicaciones o p\u00e1ginas en la barra lateral"},"content":{"rendered":"\n<p>Esta publicaci\u00f3n es para usted que administra un sitio de WordPress que tiene mucho contenido, posiblemente muchas p\u00e1ginas estructuradas en jerarqu\u00eda, y desea una mejor navegaci\u00f3n fuera del men\u00fa principal. Para ayudar a navegar por el sitio, un men\u00fa personalizado relacionado con la publicaci\u00f3n actual ser\u00e1 de gran ayuda. El problema de colocar un widget de men\u00fa en la barra lateral (o donde quieras) es que la barra lateral es com\u00fan. En esta publicaci\u00f3n, aprenderemos c\u00f3mo mostrar un men\u00fa personalizado adicional en la barra lateral, al permitir que las publicaciones, p\u00e1ginas o tipos de publicaciones personalizadas elijan un men\u00fa.<\/p>\n<p>Agregue el c\u00f3digo a continuaci\u00f3n en su tema <code>functions.php<\/code>o dentro de su c\u00f3digo de complemento.<\/p>\n<h2>Permitir que las publicaciones o p\u00e1ginas elijan un men\u00fa<\/h2>\n<p>Crear men\u00fas en WordPress es f\u00e1cil y puede usar el widget Men\u00fa para mostrar un men\u00fa en la barra lateral. El problema es que la barra lateral es global y se mostrar\u00e1 el mismo men\u00fa en todas partes. \u00bfQu\u00e9 sucede si desea que se muestren men\u00fas espec\u00edficos en p\u00e1ginas espec\u00edficas? Tambi\u00e9n aprender\u00e1 c\u00f3mo puede asegurarse de que las p\u00e1ginas secundarias hereden el men\u00fa elegido. De esa manera, solo necesita seleccionar el men\u00fa en la p\u00e1gina principal. Todas las subp\u00e1ginas tambi\u00e9n mostrar\u00e1n el mismo men\u00fa sin necesidad de editarlas todas.<\/p>\n<h3>Agregar un metabox para elegir el men\u00fa<\/h3>\n<p>El primer paso es crear un metabox en publicaciones o p\u00e1ginas donde tengamos la opci\u00f3n de elegir un men\u00fa. Usamos la funci\u00f3n <code>add_meta_box()<\/code>y decidimos para qu\u00e9 tipos de publicaciones queremos mostrarla.<\/p>\n<pre><code>add_action('add_meta_boxes', function() {\n    add_meta_box('metabox-sidebar-menu', __('Sidebar Menu', 'txtdomain'), 'awp_sidebar_menu_metabox_callback', ['post', 'page']);\n});<\/code><\/pre>\n<p>Ajuste el c\u00f3digo anterior al t\u00edtulo y los tipos de publicaci\u00f3n que desee. El ejemplo anterior agregar\u00e1 el metabox tanto a las publicaciones como a las p\u00e1ginas. El tercer par\u00e1metro, lo que he llamado <code>awp_sidebar_menu_metabox_callback<\/code>, es la funci\u00f3n responsable de representar el contenido del metabox. Vamos a definir eso a continuaci\u00f3n. Esto es lo que tendremos que hacer en nuestro metabox:<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n\u00a0\n    \/\/ Get the current saved menu, if set\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n}<\/code><\/pre>\n<p>Podemos obtener una matriz con todos los men\u00fas guardados en WordPress con <code>wp_get_nav_menus()<\/code>. En cuanto a obtener el men\u00fa elegido actual, almacenamos el men\u00fa elegido como una publicaci\u00f3n meta <code>awp_sidebar_menu<\/code>(ll\u00e1melo como quiera), y simplemente buscaremos el valor en funci\u00f3n de la corriente <code>$post<\/code>que se nos proporciona en la funci\u00f3n metabox. Guardaremos los ID de men\u00fa porque eso es todo lo que necesitamos para mostrar un men\u00fa. Y luego generamos HTML para una selecci\u00f3n que recorre los men\u00fas. La salida HTML del metabox realmente depende de usted, el siguiente es un ejemplo. Tambi\u00e9n he incluido la funcionalidad nonce por seguridad.<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n    $menus = wp_get_nav_menus();\n\u00a0\n    \/\/ Get the current saved menu, if set\n    $current_selected = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n    wp_nonce_field('awp_sidebar_menu_metabox_nonce', 'awp_sidebar_menu_nonce');\n    ?&gt;&lt;div class=\"awp-metabox-item\"&gt;\n        &lt;div class=\"awp-metabox-label\"&gt;&lt;label&gt;&lt;?php _e('Choose menu', 'txtdomain'); ?&gt;&lt;\/label&gt;&lt;\/div&gt;\n        &lt;div class=\"awp-metabox-input\"&gt;&lt;?php\n        if (empty($menus)) {\n            echo '&lt;p&gt;'. __('No menus created.', 'txtdomain'). '&lt;\/p&gt;';\n        } else { ?&gt;\n            &lt;select name=\"awp-sidebar-menu\" id=\"awp-sidebar-menu\"&gt;\n                &lt;?php \n                echo '&lt;option value=\"\"&gt;'. __('Choose menu', 'txtdomain'). '&lt;\/option&gt;';\n                foreach ($menus as $menu) { \n                    echo '&lt;option value=\"'. $menu-&gt;term_id. '\" '.selected($current_selected, $menu-&gt;term_id).'&gt;'.$menu-&gt;name.'&lt;\/option&gt;';\n                } ?&gt;\n            &lt;\/select&gt;\n        &lt;?php } ?&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;&lt;?php\n}<\/code><\/pre>\n<p>En la salida HTML estoy imprimiendo una etiqueta. Si no hay men\u00fas guardados en WordPress, simplemente mostrar\u00e1 un p\u00e1rrafo. De lo contrario, se genera una selecci\u00f3n con ID de men\u00fa como valores y nombres de men\u00fa como etiqueta. Tambi\u00e9n estoy agregando una opci\u00f3n vac\u00eda para permitir que las publicaciones no muestren un men\u00fa. Estoy usando la funci\u00f3n de ayuda de WordPress <code>[selected](https:\/\/developer.wordpress.org\/reference\/functions\/selected\/)()<\/code>para manejar el marcado de la opci\u00f3n guardada actual como seleccionada.<\/p>\n<p>Si edita una publicaci\u00f3n o p\u00e1gina, deber\u00eda ver el metabox en la parte inferior, mostrando su selecci\u00f3n. \u00a1Impresionante! Sin embargo, en este punto, actualmente no guardar\u00e1 su elecci\u00f3n de men\u00fa cuando guarde la publicaci\u00f3n. Ese es el siguiente paso.<\/p>\n<h3>Guardar la elecci\u00f3n del men\u00fa<\/h3>\n<p>Usamos el gancho <code>save_post<\/code>para crear una funci\u00f3n que guarde cualquier elecci\u00f3n que hayamos agregado en nuestro metabox. El <code>save_post<\/code>gancho se activa cada vez que se guarda o actualiza una publicaci\u00f3n. Primero revisaremos los nonces (si no est\u00e1 seguro de qu\u00e9 son los nonces, consulte esta <a href=\"https:\/\/codex.wordpress.org\/WordPress_Nonces\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">gu\u00eda de WordPress sobre los nonces<\/a> ). Luego verificamos dos veces si el usuario puede actualizar las publicaciones y actualizamos nuestra meta de publicaci\u00f3n con la opci\u00f3n.<\/p>\n<pre><code>add_action('save_post', function($post_id) {\n    if (!isset($_POST['awp_sidebar_menu_nonce']) || !wp_verify_nonce($_POST['awp_sidebar_menu_nonce'], 'awp_sidebar_menu_metabox_nonce')) {\n        return;\n    }\n\u00a0\n    if (!current_user_can('edit_post', $post_id)) {\n        return;\n    }\n\u00a0\n    update_post_meta($post_id, 'awp_sidebar_menu', $_POST['awp-sidebar-menu']);\n});<\/code><\/pre>\n<p>Ahora, cuando actualice las publicaciones, tambi\u00e9n guardar\u00e1 su elecci\u00f3n de men\u00fa.<\/p>\n<p>Y eso es todo por la parte de elecci\u00f3n de puesto. El siguiente paso es generar el men\u00fa si se seleccion\u00f3 un men\u00fa.<\/p>\n<h3>Elegir una posici\u00f3n para el men\u00fa personalizado<\/h3>\n<p>Estoy agregando la salida en la barra lateral, pero puede generarla en cualquier parte de las plantillas de su tema. Solo necesitamos un gancho predefinido o definir el nuestro. Como ejemplo, estoy agregando un gancho personalizado en la parte superior de la barra lateral, para poder crear una funci\u00f3n enganchada a esto.<\/p>\n<p>Simplemente puede llamar <code>wp_nav_menu()<\/code>directamente a la plantilla, pero recomiendo crear un enlace personalizado en su lugar porque agregaremos bastante c\u00f3digo y puede parecer desordenado.<\/p>\n<p>En mi tema, edito <code>sidebar.php<\/code>y justo antes <code>dynamic_sidebar()<\/code>de que se llame a la barra lateral (donde se agregan los widgets), agrego mi enlace personalizado con <code>do_action()<\/code>un nombre de pila. Puedes llamarlo como quieras, pero debe ser \u00fanico dentro de WordPress. As\u00ed que al menos antep\u00f3ngalo con algo \u00fanico para usted.<\/p>\n<pre><code>&lt;aside class=\"sidebar\"&gt;\n    &lt;?php \n    do_action('awp_before_sidebar');\n    dynamic_sidebar('left-sidebar'); \n    ?&gt;\n&lt;\/aside&gt;<\/code><\/pre>\n<h3>Representaci\u00f3n del men\u00fa<\/h3>\n<p>Ahora podemos volver a <code>functions.php<\/code>, definir una funci\u00f3n vinculada <code>awp_before_sidebar<\/code>y su salida se mostrar\u00e1 en la barra lateral antes de los widgets. La funci\u00f3n utilizar\u00e1 <a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags#A_Single_Page.2C_a_Single_Post.2C_an_Attachment_or_Any_Other_Custom_Post_Type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">etiquetas condicionales de WordPress<\/a> para verificar si actualmente estamos mostrando una sola publicaci\u00f3n o p\u00e1gina. Y si es as\u00ed, buscar\u00e9 nuestra publicaci\u00f3n meta. Si se configur\u00f3 el meta de la publicaci\u00f3n, generamos el men\u00fa llamando <code>[wp_nav_menu](https:\/\/developer.wordpress.org\/reference\/functions\/wp_nav_menu\/)()<\/code>y proporcionando el ID del men\u00fa guardado como su <code>menu<\/code>par\u00e1metro.<\/p>\n<pre><code>add_action('awp_before_sidebar', function() {\n    if (is_singular()) {\n        global $post;\n\u00a0\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ?&gt;&lt;section class=\"widget awp-sidebar-menu\"&gt;\n            &lt;?php wp_nav_menu(['menu' =&gt; $sidebar_menu]); ?&gt;\n        &lt;\/section&gt;&lt;?php\n    }\n});<\/code><\/pre>\n<p>Debe ajustar el HTML alrededor del men\u00fa para que encaje con el resto del contenido. En el c\u00f3digo anterior, envuelvo el men\u00fa en el mismo HTML en el que se envuelven todos los widgets en la barra lateral para que el estilo del widget del tema se aplique a nuestro men\u00fa personalizado.<\/p>\n<p>\u00a1Eso es todo! Cada vez que elija un men\u00fa en una publicaci\u00f3n o p\u00e1gina, el men\u00fa aparecer\u00e1 encima de la barra lateral cuando vea esa publicaci\u00f3n o p\u00e1gina.<\/p>\n<p>Sin embargo, podemos dar un paso m\u00e1s. Si desea que las p\u00e1ginas secundarias muestren el mismo men\u00fa de la barra lateral establecido en cualquiera de los principales, siga leyendo.<\/p>\n<h2>Permitir que las p\u00e1ginas secundarias hereden el men\u00fa principal<\/h2>\n<p>Esta funci\u00f3n adicional tiene sentido si tiene muchas p\u00e1ginas en una jerarqu\u00eda o un tipo de publicaci\u00f3n personalizada con la jerarqu\u00eda activada. Ser\u00eda demasiado engorroso editar cada p\u00e1gina secundaria y elegir el mismo men\u00fa. En ese caso, ser\u00eda mejor elegir el men\u00fa en la p\u00e1gina principal y dejar autom\u00e1ticamente que todas las subp\u00e1ginas &quot;hereden&quot; esa opci\u00f3n de men\u00fa. Si alguna subp\u00e1gina elige otro men\u00fa, ese men\u00fa se mostrar\u00e1 en lugar del &quot;heredado&quot; una vez.<\/p>\n<p>Dentro de nuestra funci\u00f3n vinculada a <code>awp_before_sidebar<\/code>, agregaremos un fragmento de c\u00f3digo, dentro de la verificaci\u00f3n si estamos viendo una sola publicaci\u00f3n o p\u00e1gina:<\/p>\n<pre><code>        ...\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n        if (!empty($sidebar_menu)) {\n            $parents = get_post_ancestors($post-&gt;ID);\n            if (!empty($parents)) {\n                \/\/ go step by step up the parents tree\n                for ($i = 0; $i &lt; count($parents); $i++) {\n                    $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n                    if (!empty($sidebar_menu)) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ...<\/code><\/pre>\n<p>Lo que hace el c\u00f3digo anterior si no se encontr\u00f3 ning\u00fan men\u00fa en la p\u00e1gina actual es buscar a todos los padres con <code>[get_post_ancestors](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_ancestors\/)()<\/code>. Esta funci\u00f3n devuelve una matriz de ID de publicaciones principales ordenadas primero por el elemento principal m\u00e1s cercano. Si la p\u00e1gina no tiene padres (por ejemplo, si es una publicaci\u00f3n), se devuelve una matriz vac\u00eda. Y si hay alg\u00fan padre, revisamos a cada padre uno por uno y verificamos si han configurado nuestro meta de publicaci\u00f3n. Si se encuentra uno, saldremos del recorrido de los padres y <code>$sidebar_menu<\/code>se establecer\u00e1 y el men\u00fa se mostrar\u00e1 m\u00e1s adelante con <code>wp_nav_menu()<\/code>.<\/p>\n<p>\u00a1Y eso es todo por la funcionalidad de &quot;herencia&quot;!<\/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>En esta publicaci\u00f3n, aprenderemos c\u00f3mo mostrar un men\u00fa personalizado en la barra lateral (o en cualquier otro lugar que desee), al permitir que las publicaciones o p\u00e1ginas elijan un men\u00fa.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[924,716,716,831,914,1110,914,800,800,831,924,840,840,861,861],"tags":[1172],"class_list":{"0":"post-233381","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-asignaturas","8":"category-desarrollador","10":"category-guia-para-principiantes","11":"category-otro","12":"category-n-a","14":"category-php-2","18":"category-tutoriales","20":"category-wordpress-2","22":"tag-affiai-es"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233381","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=233381"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233381\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}