Adicionando arquivos de tipo de postagem personalizados a um menu do WordPress
10
Existe uma maneira (além de adicionar um link personalizado) de adicionar um arquivo de tipo de postagem personalizado a um menu no WordPress? Se for adicionado usando um link personalizado (por exemplo, / cpt-archive-slug /), o WordPress não aplicará classes como current-menu-itemo elemento list, que apresenta desafios ao estilizar o menu.
Se o link personalizado contiver o URL inteiro (por exemplo, http://site.com/cpt-archive-slug/ ), essas classes serão adicionadas. No entanto, isso provavelmente não é uma 'melhor prática'.
sua melhor opção é o link personalizado com URL completo, pois os tipos de postagem personalizados são arquivos baseados em taxonomia de formulário diferente (categorias, tags, qualquer taxonomia personalizada) e arquivos baseados em data que possuem uma lesma de arquivo própria.
Tendo um item de menu de link personalizado com URL de #post_type_album, você pode usá-lo assim:
# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types('album');# And display the menu
wp_nav_menu(array('theme_location'=>'primary-nav','walker'=>new KB_Custom_Menu_Walker(),));
Nota: Isso pressupõe que a lesma e o nome do seu tipo de postagem sejam os mesmos.
+1 para a resposta de qualidade tardia. Isso é bom para a comunidade!
precisa saber é o seguinte
2
Ampliei um pouco a resposta de Tungd para fornecer mais genérica a essa abordagem. Esta implementação permite adicionar mapeamentos arbitrários entre as 'macros' do menu e os URLs internos do Wordpress que apenas o back-end conhece.
Também decidi usar !como prefixo para essas macros para evitar que se chocassem com âncoras nomeadas - isso inclui uma sobrecarga para remover o 'http: //' do URL do link (como o Wordpress tentará normalizar esses links estranhos) . Se essa implementação o incomodar, você sempre poderá remover a preg_replace()chamada e usar #como seu prefixo do link como antes.
Você pode criar uma página e aplicar um modelo de arquivo personalizado a ela. Crio e uso archive- {post-type} .php para o nome do modelo, assim como você faria no arquivo padrão, apenas aplico-o manualmente à página.
Se você fizer isso, recomendo definir seu CPT como has_archive = 'false' para evitar colisões de links permanentes, independentemente de garantir que sua página tenha uma lesma de ligação permanente diferente da que está configurada para a lesma de arquivo CPT.
Encontrei exatamente o mesmo problema e encontrei esta solução:
// $menu is the menu as a string if( check if youa re on the page you are looking for)
$menu = str_replace('<li class="menu-item"><a href="http://bla.com/bloop/">','<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">'>, $menu );
Eu acho que teria que criar um novo tipo de postagem "pai", para que o tipo de postagem personalizado que eu quero mostrar se torne um "filho", e esse pai SERÁ listado no menu.
Isso deve ser uma opção. Criar um pai falso apenas para listá-lo no menu é muito trabalhoso.
Eu gostaria de uma maneira de fazê-lo a partir do modelo, ou funções, para que eu não precise fazê-lo nas configurações de cada menu para cada site na minha instalação multisite.
Quero dizer, as postagens de tipo personalizado que eu queria mostrar no menu serão o único subtipo do pai recém-criado, e espero que ele seja listado sob o pai nas configurações do menu.
sergio
0
Encontrei esta resposta ao procurar um problema semelhante. Eu apenas copiei o código no meu arquivo finctions.php e funcionou imediatamente: espero que ajude!
O que faço em vez de adicionar o link é criar uma página vazia. Nessa página, adiciono algo como "Conteúdo gerado a partir do cpt-name" no editor para que meu cliente saiba de onde vêm todas as coisas.
Em seguida, adiciono essa página ao menu e, com o código a seguir, asseguro que seja destacado quando o archive-cpt ou single-cpt estiver em execução.
/**
* Fix to add Custom post types to nav menu
* If you custom post is called "concepts"
* create a new empty page called concepts and add this
*/function additional_active_item_classes($classes = array(), $menu_item =false){global $wp_query;if(in_array('current-menu-item', $menu_item->classes)){
$classes[]='current-menu-item';}if( $menu_item->title =='PAGE TITLE'&& is_post_type_archive('cpt-slug')){
$classes[]='current-menu-item';}if( $menu_item->title =='PAGE TITLE'&& is_singular('cpt-slug')){
$classes[]='current-menu-item';}return $classes;}
add_filter('nav_menu_css_class','additional_active_item_classes',10,2);
Isso verificará o título do menu / página e se realmente estamos vendo o arquivo ou a página individual de um tipo de postagem personalizado. Se for verdade, ele adicionará a classe de item de menu atual.
Ampliei um pouco a resposta de Tungd para fornecer mais genérica a essa abordagem. Esta implementação permite adicionar mapeamentos arbitrários entre as 'macros' do menu e os URLs internos do Wordpress que apenas o back-end conhece.
Também decidi usar
!
como prefixo para essas macros para evitar que se chocassem com âncoras nomeadas - isso inclui uma sobrecarga para remover o 'http: //' do URL do link (como o Wordpress tentará normalizar esses links estranhos) . Se essa implementação o incomodar, você sempre poderá remover apreg_replace()
chamada e usar#
como seu prefixo do link como antes.fonte
Você pode criar uma página e aplicar um modelo de arquivo personalizado a ela. Crio e uso archive- {post-type} .php para o nome do modelo, assim como você faria no arquivo padrão, apenas aplico-o manualmente à página.
Se você fizer isso, recomendo definir seu CPT como has_archive = 'false' para evitar colisões de links permanentes, independentemente de garantir que sua página tenha uma lesma de ligação permanente diferente da que está configurada para a lesma de arquivo CPT.
fonte
Encontrei exatamente o mesmo problema e encontrei esta solução:
Fonte: http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html
fonte
Eu acho que teria que criar um novo tipo de postagem "pai", para que o tipo de postagem personalizado que eu quero mostrar se torne um "filho", e esse pai SERÁ listado no menu.
Isso deve ser uma opção. Criar um pai falso apenas para listá-lo no menu é muito trabalhoso.
Eu gostaria de uma maneira de fazê-lo a partir do modelo, ou funções, para que eu não precise fazê-lo nas configurações de cada menu para cada site na minha instalação multisite.
fonte
Encontrei esta resposta ao procurar um problema semelhante. Eu apenas copiei o código no meu arquivo finctions.php e funcionou imediatamente: espero que ajude!
Navegação dinâmica para tipo de postagem personalizado (páginas)
fonte
O que faço em vez de adicionar o link é criar uma página vazia. Nessa página, adiciono algo como "Conteúdo gerado a partir do cpt-name" no editor para que meu cliente saiba de onde vêm todas as coisas.
Em seguida, adiciono essa página ao menu e, com o código a seguir, asseguro que seja destacado quando o archive-cpt ou single-cpt estiver em execução.
Isso verificará o título do menu / página e se realmente estamos vendo o arquivo ou a página individual de um tipo de postagem personalizado. Se for verdade, ele adicionará a classe de item de menu atual.
fonte