wordpress - personalizados - Cómo agregar un archivo tipo post personalizado al menú
formulario de contacto wordpress sin plugin (3)
Gracias
Gracias a rasmussvanejensen por su agradable pregunta y por la respuesta, todavía estoy confundido de por qué Wordpress aún no ha agregado una función tan buena a su base de código por defecto.
Por cierto, creo que incluso hay una solución mejor que la proporcionada por el thamín , ya que puede romper en algunas situaciones.
Nota 1
Según el Codex, al usar register_post_type, se pueden agregar post_type
adicionales a la instalación. Existe la posibilidad, alguien necesita cambiar el ''query_var'' y así se romperá el código provisto.
Nota 2
Además, es posible que no maneje la clase de current-menu-item
, que se usará para la personalización de css para mostrar el elemento de menú como activo.
Nota 3
Como otra nota sobre el código, no es necesario definir las loop_index
, item
y items
. son absolutamente inútiles.
Una mejor solución
Así que sugiero usar esta alternativa, para aquellos que quieren una solución más sólida en esto:
function prefix_add_metabox_menu_posttype_archive(){
add_meta_box( ''prefix_metabox_menu_posttype_archive'', __( ''Archives'' ), ''prefix_metabox_menu_posttype_archive'', ''nav-menus'', ''side'', ''default'' );
}
add_action( ''admin_head-nav-menus.php'', ''prefix_add_metabox_menu_posttype_archive'' );
function prefix_metabox_menu_posttype_archive(){
$post_types = get_post_types( array( ''show_in_nav_menus'' => true, ''has_archive'' => true ), ''object'' );
if( $post_types ){
foreach( $post_types as $post_type ){
$post_type->classes = array( $post_type->name );
$post_type->type = $post_type->name;
$post_type->object_id = $post_type->name;
$post_type->title = $post_type->labels->name;
$post_type->object = ''cpt_archive'';
}
$walker = new Walker_Nav_Menu_Checklist( array() );?>
<div id="cpt-archive" class="posttypediv">
<div id="tabs-panel-cpt-archive" class="tabs-panel tabs-panel-active">
<ul id="ctp-archive-checklist" class="categorychecklist form-no-clear"><?php
echo walk_nav_menu_tree( array_map( ''wp_setup_nav_menu_item'', $post_types ), 0, (object) array( ''walker'' => $walker ) );?>
</ul>
</div>
</div>
<p class="button-controls">
<span class="add-to-menu">
<input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu" value="<?php esc_attr_e( ''Add to Menu'' ); ?>" name="add-ctp-archive-menu-item" id="submit-cpt-archive" />
</span>
</p><?php
}
}
function prefix_cpt_archive_menu_filter( $items, $menu, $args ){
foreach( $items as &$item ){
if( $item->object != ''cpt_archive'' ) continue;
$item->url = get_post_type_archive_link( $item->type );
if( get_query_var( ''post_type'' ) == $item->type ){
$item->classes []= ''current-menu-item'';
$item->current = true;
}
}
return $items;
}
add_filter( ''wp_get_nav_menu_items'', ''prefix_cpt_archive_menu_filter'', 10, 3 );
He estado buscando durante semanas y todavía no he encontrado una solución adecuada a este problema.
Estoy escribiendo un tema de Wordpress. Tengo un tipo de publicación personalizada llamada Works. Me gustaría agregar mi archivo de Works a mi menú y tenerlo así como sus publicaciones resaltadas cuando accedo a ellos.
Puedo acceder a mi archivo y publicaciones en los siguientes enlaces
Archivo de obras: /works/
Trabaja una sola publicación: /works/postname/
Mi solución ha sido nombrar el archive-works.php
plantilla archive-works.php
con un nombre de plantilla (archivo de trabajo). Luego crea una página vacía usando esa plantilla y agregando la página al menú. Esto resalta el archivo en el menú, pero no las publicaciones únicas.
Puedo resolver esto fácilmente con un enlace personalizado y algunos javascript, pero debe haber una manera mejor y más limpia.
Para agregar un "enlace de archivo de tipo postal personalizado" al menú, consulte la siguiente guía
Abra file functions.php e ingrese el código a continuación
add_action(''admin_head-nav-menus.php'', ''wpclean_add_metabox_menu_posttype_archive''); function wpclean_add_metabox_menu_posttype_archive() { add_meta_box(''wpclean-metabox-nav-menu-posttype'', __(''Custom Post Type Archives''), ''wpclean_metabox_menu_posttype_archive'', ''nav-menus'', ''side'', ''default''); } function wpclean_metabox_menu_posttype_archive() { $post_types = get_post_types(array(''show_in_nav_menus'' => true, ''has_archive'' => true), ''object''); if ($post_types) : $items = array(); $loop_index = 999999; foreach ($post_types as $post_type) { $item = new stdClass(); $loop_index++; $item->object_id = $loop_index; $item->db_id = 0; $item->object = ''post_type_'' . $post_type->query_var; $item->menu_item_parent = 0; $item->type = ''custom''; $item->title = $post_type->labels->name; $item->url = get_post_type_archive_link($post_type->query_var); $item->target = ''''; $item->attr_title = ''''; $item->classes = array(); $item->xfn = ''''; $items[] = $item; } $walker = new Walker_Nav_Menu_Checklist(array()); echo ''<div id="posttype-archive" class="posttypediv">''; echo ''<div id="tabs-panel-posttype-archive" class="tabs-panel tabs-panel-active">''; echo ''<ul id="posttype-archive-checklist" class="categorychecklist form-no-clear">''; echo walk_nav_menu_tree(array_map(''wp_setup_nav_menu_item'', $items), 0, (object) array(''walker'' => $walker)); echo ''</ul>''; echo ''</div>''; echo ''</div>''; echo ''<p class="button-controls">''; echo ''<span class="add-to-menu">''; echo ''<input type="submit"'' . disabled(1, 0) . '' class="button-secondary submit-add-to-menu right" value="'' . __(''Add to Menu'') . ''" name="add-posttype-archive-menu-item" id="submit-posttype-archive" />''; echo ''<span class="spinner"></span>''; echo ''</span>''; echo ''</p>''; endif; }
Puedes hacer un truco simple en tus funciones.php:
add_filter(''nav_menu_css_class'', ''current_type_nav_class'', 10, 2);
function current_type_nav_class($classes, $item) {
// Get post_type for this post
$post_type = get_query_var(''post_type'');
// Go to Menus and add a menu class named: {custom-post-type}-menu-item
// This adds a ''current_page_parent'' class to the parent menu item
if( in_array( $post_type.''-menu-item'', $classes ) )
array_push($classes, ''current_page_parent'');
return $classes;
}
En su caso, solo tiene que agregar una clase ''works-menu-item'' con ese elemento de menú de archivo por el panel de administración;