2010-07-17 14 views
8

He creado un tipo de publicación personalizado de 'cartera' y una página con una plantilla que recupera todas las publicaciones que coinciden con ese tipo de publicación personalizada.Wordpress jerarquía de tipo de publicación personalizada y resaltado de menú (página_actual_parent)

El problema es cuando los detalles en el puesto actual, el mensaje parece sentarse bajo el blog 'en el menú principal (destacando las pantallas current_page_parent como clase)

La url enlace permanente es correcta: www.site .com/portfolio/post-slug

Pero el menú piensa que el padre es 'blog'.

Esto es obviamente un problema jerárquico pero no sé qué hacer para solucionarlo.

Respuesta

10

Parece que esto es un problema con el código principal de Wordpress; el código que genera las clases de menú agrega current_page_parent a su página de blog en todas partes excepto cuando se visualizan plantillas de página estáticas.

(Esto se ha discutido de pasada en http://core.trac.wordpress.org/ticket/13543).

Sin embargo, puede evitar esto con un código personalizado con el filtro page_css_class. Por ejemplo, añadir algo a lo largo de estas líneas para functions.php (probado no 100%):

function my_page_css_class($css_class, $page) { 
    if (get_post_type()=='portfolio' || is_page(57)) { 
     if ($page->ID == get_option('page_for_posts')) { 
      foreach ($css_class as $k=>$v) { 
       if ($v=='current_page_parent') unset($css_class[$k]); 
      } 
     } 
     if ($page->ID==57) { 
      $css_class[]='current_page_parent'; 
     } 
    } 
    return $css_class; 
} 
add_filter('page_css_class','my_page_css_class',10,2);

Sustitución de 57 con el ID de la página de carteras, por supuesto. Esto elimina current_page_parent cuando se imprime la página del blog y agrega current_page_parent a la página de sus portafolios, ya sea al visualizar un solo portafolio o al ver la página de portafolios.

+0

+1 Excelente hallazgo, me alegra escuchar que está en trac – TheDeadMedic

+1

Lo he hecho con CSS y clases corporales por ahora. Gracias por la función sin embargo. – Craig

+0

+1 gran pequeño fragmento aquí, me salvó un montón :) – Xavier

0

Hice un poco más de observación sobre esto y encontré otra forma de hacerlo.

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; 

}

Tengo algún tipo de ayuda este post y luego lo modificó para eliminar también la clase "current_page_parent" de la página del blog. https://wordpress.stackexchange.com/questions/3014/highlighting-wp-nav-menu-ancestor-class-w-o-children-in-nav-structure/3034#3034

Cordialmente Vayú

+0

Wups, se suponía que esta respuesta vendría después de mi pregunta anterior a continuación ... –

3

billete WP: http://core.trac.wordpress.org/ticket/16382

function fix_blog_menu_css_class($classes, $item) { 
    if (is_tax('my-cat-tax') || is_singular('my-post-type') || is_post_type_archive('my-post-type')) { 
     if ($item->object_id == get_option('page_for_posts')) { 
      $key = array_search('current_page_parent', $classes); 
      if (false !== $key) 
       unset($classes[ $key ]); 
     } 
    } 

    return $classes; 
} 
add_filter('nav_menu_css_class', 'fix_blog_menu_css_class', 10, 2); 
0

Aquí es una solución que funcionó para mí, sin tener que definir mi tipo de mensaje personalizado o Identificación del menú o la página id en el código :

http://dtbaker.net/web-development/how-to-stop-wordpress-automatically-highlighting-the-blog-page-in-the-menu/

 
function dtbaker_wp_nav_menu_objects($sorted_menu_items, $args){ 
    // this is the code from nav-menu-template.php that we want to stop running 
    // so we try our best to "reverse" this code wp code in this filter. 
    /* if (! empty($home_page_id) && 'post_type' == $menu_item->type && empty($wp_query->is_page) && $home_page_id == $menu_item->object_id) 
      $classes[] = 'current_page_parent'; */ 

    // check if the current page is really a blog post. 
    //print_r($wp_query);exit; 
    global $wp_query; 
    if(!empty($wp_query->queried_object_id)){ 
     $current_page = get_post($wp_query->queried_object_id); 
     if($current_page && $current_page->post_type=='post'){ 
      //yes! 
     }else{ 
      $current_page = false; 
     } 
    }else{ 
     $current_page = false; 
    } 


    $home_page_id = (int) get_option('page_for_posts'); 
    foreach($sorted_menu_items as $id => $menu_item){ 
     if (! empty($home_page_id) && 'post_type' == $menu_item->type && empty($wp_query->is_page) && $home_page_id == $menu_item->object_id){ 
      if(!$current_page){ 
       foreach($sorted_menu_items[$id]->classes as $classid=>$classname){ 
        if($classname=='current_page_parent'){ 
         unset($sorted_menu_items[$id]->classes[$classid]); 
        } 
       } 
      } 
     } 
    } 
    return $sorted_menu_items; 
} 
add_filter('wp_nav_menu_objects','dtbaker_wp_nav_menu_objects',10,2); 
5

Aquí está mi versión optimizada/extendida de las soluciones sugeridas anteriormente, que es casi totalmente automática. No se necesitan más atributos adicionales de CSS o menú.

Esta versión obtiene dinámicamente una lista de tipos de publicaciones personalizadas y, si el tipo de publicación actual es un tipo de publicación personalizado, elimina la clase 'current_page_parent' de todos los elementos del menú.

Además, comprueba cada elemento del menú para ver si es para una página con una plantilla de página como "página- {custom_post_type_slug} .php", y si es así, agregará la clase 'current_page_parent'.

La prioridad del filtro es 1, como algunos temas, reemplaza el actual_page_parent/etc. clases con una clase como 'activo' (por ejemplo, 'roots' lo hace), por lo que este filtro debe ejecutarse primero.

Por último, utiliza 3 variables estáticas ya que esta función se llama repetidamente y estas (obviamente) permanecen iguales en todas las llamadas.

function theme_current_type_nav_class($css_class, $item) { 
    static $custom_post_types, $post_type, $filter_func; 

    if (empty($custom_post_types)) 
     $custom_post_types = get_post_types(array('_builtin' => false)); 

    if (empty($post_type)) 
     $post_type = get_post_type(); 

    if ('page' == $item->object && in_array($post_type, $custom_post_types)) { 
     if (empty($filter_func)) 
      $filter_func = create_function('$el', 'return ($el != "current_page_parent");'); 

     $css_class = array_filter($css_class, $filter_func); 

     $template = get_page_template_slug($item->object_id); 
     if (!empty($template) && preg_match("/^page(-[^-]+)*-$post_type/", $template) === 1) 
      array_push($css_class, 'current_page_parent'); 

    } 

    return $css_class; 
} 
add_filter('nav_menu_css_class', 'theme_current_type_nav_class', 1, 2); 

PS. Solo para señalar una deficiencia en todas las soluciones que no son CSS que he visto hasta ahora, incluida la mía: Algo que no se tiene en cuenta es resaltar el elemento de menú padre/ancestro de un elemento que se vincula a una página que muestra publicaciones de la corriente tipo de publicación personalizada. Considere una costumbre tipo de mensaje "producto" y un menú como:

Home Company News Contact 
     | 
     \--About Us 
     \--Products 

"productos" es una página con una plantilla "página-product.php" y muestra una visión general de los mensajes de tipo 'producto'. Se destaca debido a la solución publicada. Sin embargo, 'Compañía' como su padre/ancestro también debe ser resaltada, pero no lo es. Algo para tener en cuenta.

+0

gracias. Esto resolvió mi problema con la publicación del blog recibiendo una clase activa mientras veía un tipo de mensaje personalizado – Mattijs

Cuestiones relacionadas