Adicionando arquivos de tipo de postagem personalizados a um menu do WordPress

10

Existe uma maneira (além de adicionar um link personalizado) para 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-item ao elemento list, o que apresenta desafios ao estilizar o menu.

Se o link personalizado contiver o URL inteiro (por exemplo, enlace ), essas classes serão adicionadas. No entanto, isso provavelmente não é uma 'melhor prática'.

    
por Travis Northcutt 25.02.2011 / 21:44

8 respostas

5

sua melhor opção é o link personalizado com o URL completo, pois os arquivos de tipos de postagens personalizadas são arquivos baseados em taxonomia de formulários diferentes (categorias, tags, qualquer taxonomia personalizada) e arquivos baseados em data que possuem o próprio arquivo slug.

    
por Bainternet 25.02.2011 / 23:35
6

Eu sei que isso é antigo, mas também tenho esse problema e descobri que uma maneira bastante simples de lidar com isso é usar um menu personalizado

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ '#post_type_'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}

Ter 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(),
));

Observação: isso pressupõe que o slug e o nome do seu post sejam os mesmos.

    
por tungd 08.09.2012 / 05:15
2

Eu expandi um pouco na resposta da tungd para fornecer mais genericidade com essa abordagem. Essa implementação permite adicionar mapeamentos arbitrários entre macros de menu e URLs internas do Wordpress que apenas o backend conhece.

Eu também decidi usar ! como o prefixo dessas macros para evitar que entrem em conflito com âncoras nomeadas - isso inclui uma sobrecarga para remover o 'http: //' da URL do link (como o Wordpress tentará para normalizar esses links estranhos). Se essa implementação incomodar, você sempre poderá remover a chamada preg_replace() e usar # como seu prefixo de link como antes.

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace('@^https?://@', '', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls['!' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping('post_type_' . $type, get_post_type_archive_link($type));
    }
}

add_action('init', array('Extendable_Menu_Walker', 'setupUrls'));
    
por pospi 22.02.2013 / 05:13
1

Você pode criar uma página e, em seguida, aplicar um modelo de arquivo personalizado a ela. Eu crio e uso o archive- {post-type} .php para o nome do template como você faria para o arquivo padrão, eu apenas o aplico manualmente na página.

Se você fizer isso, eu recomendaria configurar seu CPT para has_archive = 'false' para evitar colisões permalink, independentemente de ter certeza de que sua página tem um slut permalink diferente do que seu slot de arquivo CPT está definido.

    
por jb510 25.04.2011 / 01:16
1

Eu encontrei o mesmo problema exato 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 );  

Fonte: enlace

    
por TJK 14.07.2011 / 20:52
0

Eu acho que teria que criar um novo tipo de post "pai", então o tipo de post personalizado que eu quero mostrar se torna um "filho", e esse pai será listado no menu.

Isso deve ser uma opção. Criando um pai fictício apenas para obtê-lo listado no menu é muito trabalho.

Eu gostaria de uma maneira de fazer isso a partir do modelo, ou funções, então eu não tenho que fazer isso em cada configuração de menu para cada site na minha instalação multi-site.

    
por sergio 27.09.2011 / 17:03
0

Eu encontrei esta resposta ao procurar por um problema semelhante. Acabei de copiar o código para o meu arquivo finctions.php e ele funcionou de imediato: espero que ajude!

Navegação dinâmica para o tipo de postagem personalizada (páginas)

    
por Ole Henrik Skogstrøm 03.01.2012 / 14:38
0

O que eu faço em vez de adicionar o link é criar uma página vazia. Nessa página eu adiciono algo como "Conteúdo gerado pelo cpt-name" no editor, então meu cliente sabe de onde tudo está vindo.

Depois, adiciono essa página ao menu e, com o seguinte código, asseguro que esteja destacado quando o arquivo archives-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 do item do menu atual.

    
por chifliiiii 27.11.2013 / 12:21