Agregar archivos de tipo de publicación personalizada a un menú de WordPress


10

¿Hay alguna manera (además de agregar un enlace personalizado) para agregar un archivo de tipo de publicación personalizado a un menú en WordPress? Si se agrega utilizando un enlace personalizado (por ejemplo, / cpt-archive-slug /), WordPress no aplica clases como current-menu-itemal elemento de la lista, lo que presenta desafíos al diseñar el menú.

Si el enlace personalizado contiene la URL completa (por ejemplo, http://site.com/cpt-archive-slug/ ), se agregarán esas clases. Sin embargo, eso probablemente no sea una 'mejor práctica'.

Respuestas:


5

su mejor opción es un enlace personalizado con una URL completa, ya que los archivos de tipos de publicaciones personalizadas son archivos basados ​​en taxonomía de diferentes formas (categorías, etiquetas, cualquier taxonomía personalizada) y archivos basados ​​en fechas que tienen su propia babosa de archivo.


6

Sé que esto es antiguo, pero también tengo este problema y encontré una forma bastante limpia de manejarlo, es usar un menú 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;
  }
}

Al tener un elemento de menú de enlace personalizado con URL de #post_type_album, puede usarlo así:

# 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: Esto supone que el slug y el nombre de su tipo de publicación son iguales.


+1 por la respuesta de calidad tardía. ¡Esto es bueno para la comunidad!
Brian Fegter

2

He ampliado un poco la respuesta de tungd para proporcionar más genérico con ese enfoque. Esta implementación permite agregar asignaciones arbitrarias entre las 'macros' del menú y las URL internas de Wordpress que solo el backend conoce.

También he decidido usarlo !como prefijo para estas macros para evitar que entren en conflicto con anclas con nombre; esto incluye una sobrecarga para quitar el 'http: //' de la URL del enlace (ya que Wordpress intentará normalizar estos enlaces extraños) . Si esa implementación te molesta, siempre puedes eliminar la preg_replace()llamada y usarla #como prefijo de enlace 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

Puede crear una página y luego aplicarle una plantilla de archivo personalizada. Creo y uso archive- {post-type} .php para el nombre de la plantilla como lo haría para el archivo predeterminado, simplemente lo aplico manualmente a la página.

Si hace esto, le recomiendo configurar su CPT en has_archive = 'false' para evitar colisiones de enlaces permanentes, independientemente de que solo se asegure de que su página tenga un enlace de enlace permanente diferente al que está configurado en su archivo de archivo CPT.



0

Creo que tendría que crear un nuevo tipo de mensaje "principal", por lo que el tipo de mensaje personalizado que quiero mostrar se convierte en un "elemento secundario", y ese elemento primario aparecerá en el menú.

Esto debería ser una opción. Crear un padre ficticio solo para que aparezca en el menú es demasiado trabajo.

Me gustaría una manera de hacerlo desde la plantilla, o funciones, para no tener que hacerlo en la configuración de cada menú para cada sitio en mi instalación multisitio.


1
Es decir, las publicaciones de tipo de publicación personalizada que quería mostrar en el menú serán el único subtipo del padre nuevo creado, y espero que aparezca en la configuración del menú debajo del padre.
sergio


0

Lo que hago en lugar de agregar el enlace es crear una página vacía. En esa página agrego algo como "Contenido generado a partir de cpt-name" en el editor para que mi cliente sepa de dónde provienen todas las cosas.

Luego agrego esa página al menú y con el siguiente código me aseguro de que esté resaltado cuando se ejecuta archives-cpt o single-cpt.

/**
 * 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 );

Esto verificará el menú / título de la página y si realmente estamos viendo el archivo o la página individual de un tipo de publicación personalizada. Si es cierto, agregará la clase de elemento de menú actual.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.