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'.

Respostas:


5

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.


6

Sei que isso é antigo, mas também tenho esse problema e achei uma maneira bastante clara de lidar com isso: usar um walker de 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;
  }
}

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.

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'));

1

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.



0

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.


11
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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.