listar - wordpress custom post type generator plugin
Wordpress custom type jerarquía y menú resaltado(current_page_parent) (5)
Creé un tipo de publicación personalizada de ''cartera'' y página con una plantilla que recupera todas las publicaciones que coinciden con ese tipo de publicación personalizada.
El problema es que cuando profundizo en la publicación real, la publicación parece estar debajo de ''blog'' en el menú principal resaltado (muestra current_page_parent como clase)
La URL del 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.
Parece que este 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 paso en http://core.trac.wordpress.org/ticket/13543 ).
Sin embargo, puede evitar esto con un código personalizado utilizando el filtro page_css_class. Por ejemplo, agregue algo en estas líneas a functions.php (no 100% probado):
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);
Reemplazando 57 con el ID de su 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.
Boleto de 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 );
Aquí hay una solución que funcionó para mí, sin tener que definir mi tipo de publicación personalizada o ID de menú o ID de página en el código:
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);
Aquí está mi versión optimizada / extendida de las soluciones sugeridas anteriormente, que está casi totalmente automatizada. 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 de filtro es 1, como algunos temas, reemplazan 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);
PD. Solo para señalar una falla 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 del menú principal / ancestro de un elemento que se vincula a una página que muestra publicaciones de la personalización actual tipo de mensaje. Considere un tipo de mensaje personalizado "producto" y un menú como:
Home Company News Contact
|
/--About Us
/--Products
"Productos" es una página con una plantilla "page-product.php" y muestra una descripción general de las publicaciones 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.
Hice un poco más de investigació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;
}
Obtuve algo de ayuda de esta publicación y luego la modifiqué 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-wo-children-in-nav-structure/3034#3034
Cordialmente Vayu