Destacando wp_nav_menu () antepasado Clase w / o Niños en la estructura de navegación?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/3014

  •  16-10-2019
  •  | 
  •  

Pregunta

( Moderadores Nota: se tituló originalmente "wp_nav_menu clase antepasado sin niños en estructura de navegación")

Tengo un wp_nav_menu en mi cabecera, que tenía tres páginas en el mismo. Cuando estoy en una de esas páginas, el li que contiene esa página en el menú obtiene el .current_page_item clase. Estas tres páginas tienen plantillas, y estas plantillas contienen consultas personalizadas para obtener todos los mensajes de un determinado tipo de contenido. En efecto, la percepción de "niños" de esta página de nivel superior no son en realidad los niños, que son sólo de un tipo de contenido que he asociado a esa página de nivel superior utilizando una plantilla.

Me gustaría que los elementos de menú de nivel superior para obtener una clase 'current-ancestor' cuando el usuario está navegando en una sola página de un tipo específico de correos, de nuevo, asociado con esa página sólo en una consulta personalizada en el archivo de plantilla.

La esperanza que tiene sentido - si no, me dejó saber dónde te perdí! Apreciamos mucho cualquier ayuda.

- Editado para obtener información específica: Por ejemplo, tengo una página estática llamado Talleres que está utilizando una plantilla. Su babosa es talleres . La plantilla tiene una función get_posts personalizados y un bucle dentro de ella, que tira y muestra todos los mensajes de un tipo de contenido personalizado llamado talleres . Si hago clic en uno de estos talleres título, Me llevan a todo el contenido de esa parte del contenido. La estructura de enlaces permanentes del tipo de envío personalizado se establece en talleres / postname , de manera que el usuario ve, estas piezas de contenido son hijos de la página de Talleres, cuando en realidad son todos de un mismo contenido escribir, pero sin relación con la página. Es ese hueco que tengo que efectivamente cercano en el menú, destacando el elemento de menú 'Talleres' al examinar el contenido del tipo 'taller'.

Una vez más, la esperanza que tiene sentido, creo que dije 'taller' más de 20 veces en un párrafo

¿Fue útil?

Solución

No es una solución más simple. Olvídese de la creación de páginas para cada tipo de mensaje sólo para que pueda tener los elementos de navegación, porque como usted ha aprendido, WP no tiene manera de reconocer que los tipos personalizados son la navegación están relacionados con esa página.

En su lugar, crear un enlace personalizado en apariencia-> Menú. Sólo hay que poner la URL que devolverá el tipo personalizado y darle una etiqueta, a continuación, pulse el botón "Añadir al menú".

http://example.com/workshops/

o no-pretty-enlaces permanentes:

http://example.com/?post_type=workshops

esto solo será simplemente crear un botón de navegación, que muestra todos los mensajes con ese tipo de envío personalizado, y también se sumará a la clase-elemento de menú actual cuando se ha hecho clic en ese elemento de navegación - pero todavía no lo hará añadir la clase de navegación en cualquier URL que no sea éste

A continuación, una vez que ha creado, vaya a la configuración de ese nuevo elemento, y entrar en la babosa del tipo de mensaje personalizado en el campo "Título Atributo" (también se puede utilizar el campo de descripción, sino que uno se oculta en el opciones de la pantalla de administrador por defecto).

Ahora, es necesario conectar el filtro nav_menu_css_class (que es despedido para cada elemento de navegación) y comprobar si el contenido que se está viendo es del tipo de mensaje se indica en su artículo de navegación personalizada:

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {
    $post_type = get_query_var('post_type');
    if ($item->attr_title != '' && $item->attr_title == $post_type) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}

En este caso, vamos a comprobar que el contenido del campo Título atributo no están vacías y si coinciden con la post_type actual que se está consultando. Si es así, le añadimos la clase-menu-elemento actual a su matriz de clase, a continuación, devolver la matriz modificada.

Se puede modificar esto para simplemente coincidir con el título del elemento de navegación, pero si por alguna razón se quiere título del elemento de navegación de manera diferente a la babosa llanura del tipo de mensaje, utilizando el atributo de título o la descripción de campo le da la flexibilidad .

Ahora cualquier momento que está viendo un único elemento (o probablemente incluso listados de archivo) de un tipo de mensaje que coincide con una opción de menú de navegación, que el tema se le dará la corriente de elemento de menú clase CSS por lo que su resaltado funcionará.

No hay páginas o plantillas de página necesario ;-) La consulta de URL se encarga de ir a buscar los mensajes correctos. La plantilla de bucle se encarga de mostrar consulta de salida. Esta función se encarga de reconocer lo que se muestra y la adición de la clase CSS.

prima

Incluso puede automatizar el proceso usando wp_update_nav_menu_item, por tener elementos de menú generados automáticamente para todos los tipos de envíos. Para este ejemplo, se necesitaría primero en haber recuperado la $menu_id del menú de navegación que desea este artículos añadidos a.

$types = get_post_types( array( 'exclude_from_search' => false, '_builtin' => false  ), 'objects' );
foreach ($types as $type) {
    wp_update_nav_menu_item( $menu_id, 0, array(
        'menu-item-type' => 'custom',
        'menu-item-title' => $type->labels->name,
        'menu-item-url' => get_bloginfo('url') . '/?post_type=' . $type->rewrite['slug'],
        'menu-item-attr-title' => $type->rewrite['slug'],
        'menu-item-status' => 'publish'
        )
    );
}

Otros consejos

en lugar de utilizar

$ = post_type get_query_var ( 'post_type');

Es posible que desee probar:

$ post_type = get_post_type ();

A medida que apretaba el tipo de mensaje no se establece en la consulta var. Este es el caso de la post_type por defecto de "post", por lo que si se desea resaltar un puesto que estaba en la lista de una página de lista, tendrá que utilizar esto. get_very_var () sólo devuelve una cadena vacía para este tipo de correos que no son personalizados.

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {
    $post_type = get_post_type();
    if ($item->attr_title != '' && $item->attr_title == $post_type) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}

@Somatic - que es fantástico! He modificado su código un poco por lo que también trabaja para una taxonomía específica (que estoy usando sólo para el post_type relacionada). La idea es utilizar el atributo Título del elemento de menú para almacenar tanto el nombre de la post_type Y el nombre de la taxonomía, separadas por un punto y coma, y ??luego explotar por la función.

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {

    # get Query Vars
    $post_type = get_query_var('post_type');  
    $taxonomy = get_query_var('taxonomy');

    # get and parse Title attribute of Menu item
    $title = $item->attr_title; // menu item Title attribute, as post_type;taxonomy
    $title_array = explode(";", $title);
    $title_posttype = $title_array[0];
    $title_taxonomy = $title_array[1];

    # add class if needed
    if ($title != '' && ($title_posttype == $post_type || $title_taxonomy == $taxonomy)) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}

Aquí mi solución si se quiere trabajar con wp_list_pages.

añadir esto en su functions.php

add_filter('page_css_class', 'my_page_css_class', 10, 2);
function my_page_css_class($css_class, $page){
    $post_type = get_post_type();
    if($post_type != "page"){
        $parent_page = get_option('page_for_custom_post_type-'.$post_type);
        if($page->ID == $parent_page)
            $css_class[] = 'current_page_parent';
    }
    return $css_class;
}

Ahora sólo tiene que añadir en la tabla wp_options una nueva fila con un option_name page_for_custom_post_type-xxxx y valor_opción con el página- ID u desea conectar.

Tal vez se reconoce que ya existe una opción llamada page_for_posts . Si u solamente tienen 1 a medida Tipo de post u puede configurar su página en /wp-admin/options-reading.php en el menú desplegable y la navegación se ajustará la CURRENT_PAGE correctamente.

Creo núcleo wordpress debe extenderse esta sección con un menú desplegable para cada tipo de correo certificado.

decidí seguir con páginas y utilizar el nombre de plantilla de página como una clase sobre el tema de navegación. Esto me permite evitar llenar el atributo de título, que no me gusta de algunas de las otras soluciones.

add_filter('nav_menu_css_class', 'mbudm_add_page_type_to_menu', 10, 2 );
//If a menu item is a page then add the template name to it as a css class 
function mbudm_add_page_type_to_menu($classes, $item) {
    if($item->object == 'page'){
        $template_name = get_post_meta( $item->object_id, '_wp_page_template', true );
        $new_class =str_replace(".php","",$template_name);
        array_push($classes, $new_class);
        return $classes;
    }   
}

También tengo clases cuerpo añadido a header.php

<body <?php body_class(); ?>>

Por último, esta solución requiere un poco de CSS extra para aplicar el estado seleccionado / activo para los elementos de menú de navegación. Yo lo uso para mostrar archivos de taxonomía y tipos de envíos personalizados relacionados con la página como hijos de esta página:

/* selected states - include sub pages for anything related to products */
#nav-main li.current-menu-item a,
body.single-mbudm_product #nav-main li.lp_products a,
body.tax-mbudm_product_category #nav-main li.lp_products a,
#nav-main li.current_page_parent a{color:#c00;}

@Somatic - Gran código! Hice un cambio a mí mismo. Quería mantener el atributo title para su finalidad prevista, así que en vez coloqué la babosa de un tipo de mensaje en la relación Enlace (XFN) propiedades avanzadas del menú que se puede habilitar en la pantalla de opciones. He modificado

if ($item->attr_title != '' && $item->attr_title == $post_type) {

y lo cambió a

if ($item->xfn != '' && $item->xfn == $post_type) {

Buen trabajo somática.

Por desgracia, yo no entiendo cómo se puede enumerar sus tipos de envíos personalizados en una página de la forma en que explica. Si no utilizo una página-portfolio.php y añadirlo a una página, lo único que consigue es de 404 páginas.

Si me gusta Gavin hace, he modificado a funcionar un poco para quitar también el "current_page_parent" de la página del blog como este.

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2);
function current_type_nav_class($css_class, $item) {
$post_type = get_query_var('post_type');

if (get_post_type()=='portfolio') {
    $current_value = "current_page_parent"; 
    $css_class = array_filter($css_class, function ($element) use ($current_value) { return ($element != $current_value); } );
}

if ($item->attr_title != '' && $item->attr_title == $post_type) {       
    array_push($css_class, 'current_page_parent');
};
return $css_class;

}

Licenciado bajo: CC-BY-SA con atribución
scroll top