Eu estou tendo um problema com o meu menu e tipo de postagem personalizada.
Eu tenho um tipo de post personalizado de "serviços". Eu criei uma nova página para isso chamada Serviços. Nessa página, estou exibindo uma lista de todas as postagens desse tipo de postagem personalizada. A classe de item de menu atual está funcionando como itended.
Mas o problema é quando eu clico em um dos serviços e vou para mysite.com/services/service-1, o item de menu atual da página de serviços no menu desaparece. Eu preciso mostrar que esta postagem atual é filha da página Serviços.
Todos os itens do menu têm o mesmo HTML:
<li id="menu-item-23" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23"><a href="http://localhost/wordpress/sluzby/">Služby</a></li>
Não há nenhuma classe CSS que eu possa usar para estilizar esse link como pai. Algo como pai-menu atual ou algo assim. Como eu poderia consertar isso? Obrigado.
Eu costumo incluir a seguinte variável pai, filtro e método em meus plugins para dar conta deste caso. Eu nunca tive certeza se esse é o jeito "certo" de fazer isso, mas é melhor do que aplicá-lo com o javascript.
class Plugin_Name {
private $parent = 'services'; // ideally this is a setting in your plugin, not a hard-coded variable in case the page slug changes
function __construct() {
// Add classes to 'parent'
add_filter( 'nav_menu_css_class', array( &$this, 'nav_parent_class' ), 10, 2 );
}
function nav_parent_class( $classes, $item ) {
if ( $this->nicename == get_post_type() && ! is_admin() ) {
global $wpdb;
// remove any active classes from nav (blog is usually gets the currept_page_parent class on cpt single pages/posts)
$classes = array_filter($classes, ($class == 'current_page_item' || $class == 'current_page_parent' || $class == 'current_page_ancestor' || $class == 'current-menu-item' ? false : true ));
// get page info
// - we really just want the post_name so it cane be compared to the post type slug
$page = get_page_by_title( $item->title, OBJECT, 'page' );
// check if slug matches post_name
if( $page->post_name == $this->parent ) {
$classes[] = 'current_page_parent';
}
}
return $classes;
}
}
Por sua solicitação, rota sem plug-in. Eu não testei isso por nenhum erro, apenas adaptado da classe acima, mas deveria ao menos levá-lo na direção certa:
add_filter( 'nav_menu_css_class', 'nav_parent_class', 10, 2 );
function nav_parent_class( $classes, $item ) {
$cpt_name = 'service';
$parent_slug = 'services';
if ( $cpt_name == get_post_type() && ! is_admin() ) {
global $wpdb;
// remove any active classes from nav (blog is usually gets the currept_page_parent class on cpt single pages/posts)
$classes = array_filter($classes, ($class == 'current_page_item' || $class == 'current_page_parent' || $class == 'current_page_ancestor' || $class == 'current-menu-item' ? false : true ));
// get page info
// - we really just want the post_name so it cane be compared to the post type slug
$page = get_page_by_title( $item->title, OBJECT, 'page' );
// check if slug matches post_name
if( $page->post_name == $parent_slug ) {
$classes[] = 'current_page_parent';
}
}
return $classes;
}
Código final:
function nav_parent_class($classes, $item) {
$cpt_name = 'services';
$parent_slug = 'sluzby';
if ($cpt_name == get_post_type() && !is_admin()) {
global $wpdb;
// get page info (we really just want the post_name so it can be compared to the post type slug)
$page = get_page_by_title($item->title, OBJECT, 'page');
// check if slug matches post_name
if( $page->post_name == $parent_slug ) {
$classes[] = 'current_page_parent';
}
}
return $classes;
}
add_filter('nav_menu_css_class', 'nav_parent_class', 10, 2);
Este código adiciona classe 'current-menu-item' ao menu de item pai de seu CPT filho ou taxonomia personalizada ou postagem única padrão, caso você não tenha uma estrutura de menu aninhada no painel de administração - somente se você tiver 'nível 0' cardápio. Por exemplo - se você tiver o Page Product, que exibe a grade de produtos e acessa o único produto - WP não verá o item de menu pai. O código abaixo melhora isso:
function additional_active_item_classes( $classes = array(), $menu_item = false ) {
// custom taxonomy
if ( $menu_item->title == 'Custom Tax Name Page' && is_tax('custom_tax') ) {
$classes[] = 'current-menu-item';
}
// custom post type single
if ( $menu_item->title == 'Custom Post Type Page' && is_singular('products') ) {
$classes[] = 'current-menu-item';
}
// blog post single
if ( $menu_item->title == 'Blog Page' && is_singular('post') ) {
$classes[] = 'current-menu-item';
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'additional_active_item_classes', 10, 2 );
Normalmente, há uma classe de ascendente-menu-atual-corrente adicionada aos itens pais na navegação.
Se não houver, dê uma olhada neste post: Como incluir a classe 'current-menu-ancestor' em um menu de tipo de post personalizado no Wordpress?