it-swarm-pt.com

classe de item de menu atual para pai de tipo de postagem personalizado

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.

1
Richard Mišenčík

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;
}
5
Joey Yax

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);
1
Richard Mišenčík

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 );
1
Marek

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?

0
Joe