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

10

¿Hay alguna forma (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 mediante un enlace personalizado (por ejemplo, / cpt-archive-slug /), WordPress no aplica clases como current-menu-item al elemento de la lista, lo que presenta desafíos al diseñar el menú.

Si el enlace personalizado contiene la URL completa (por ejemplo, enlace ), se agregan esas clases. Sin embargo, eso probablemente no sea una "mejor práctica".

    
pregunta Travis Northcutt 25.02.2011 - 21:44

8 respuestas

5

su mejor opción es un enlace personalizado con url completo, ya que los archivos de tipos de correos personalizados son archivos basados en taxonomía de forma diferente (categorías, etiquetas, cualquier taxonomía personalizada) y archivos basados en fecha que tienen su propia barra de archivo.

    
respondido por el Bainternet 25.02.2011 - 23:35
6

Sé que esto es antiguo, pero también tengo este problema y encontré que una manera bastante limpia de manejarlo es usar un menú personalizado a pie

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 la URL de #post_type_album , puedes 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 la barra y el nombre de tu tipo de publicación son los mismos.

    
respondido por el tungd 08.09.2012 - 05:15
2

Me he expandido un poco en 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 decidí usar ! como el prefijo de estas macros para evitar que entren en conflicto con los anclajes con nombre. Esto incluye una sobrecarga para eliminar 'http: //' de la URL del enlace (como Wordpress intentará para normalizar estos enlaces raros). Si esa implementación le molesta, siempre puede eliminar la llamada preg_replace() y usar # como su 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'));
    
respondido por el pospi 22.02.2013 - 05:13
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, solo lo aplico manualmente a la página.

Si haces esto, te recomendaría que configures tu CPT a has_archive = 'false' para evitar las colisiones de enlaces permanentes, sin importar que solo asegures de que tu página tenga una bala de enlaces permanentes diferente a la de tu barra de archivos CPT.

    
respondido por el jb510 25.04.2011 - 01:16
1

Me encontré con el mismo problema exacto y encontré esta solución:

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

Fuente: enlace

    
respondido por el TJK 14.07.2011 - 20:52
0

Creo que tendría que crear un nuevo post tipo "padre", por lo que el tipo de mensaje personalizado que quiero mostrar se convierte en un "niño", y ese padre 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 forma de hacerlo desde la plantilla o las funciones, para no tener que hacerlo en cada configuración de menú para cada sitio en mi instalación multisitio.

    
respondido por el sergio 27.09.2011 - 17:03
0

Encontré esta respuesta al buscar un problema similar. Acabo de copiar el código en mi archivo finctions.php y funcionó desde el primer momento :) ¡espero que ayude!

Navegación dinámica para el tipo de publicación personalizada (páginas)

    
respondido por el Ole Henrik Skogstrøm 03.01.2012 - 14:38
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 desde cpt-name" en el editor para que mi cliente sepa de dónde vienen todas las cosas.

Luego agrego esa página al menú y con el siguiente código me aseguro de que esté resaltado cuando se estén ejecutando 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 comprobará el título del menú / página y si 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.

    
respondido por el chifliiiii 27.11.2013 - 12:21

Lea otras preguntas en las etiquetas