Come aggiungere link alle pagine archivio dei custom post type nel menu di navigazione?
Non riesco a capire come fare. Sembra non ci sia alcuna checkbox o funzionalità simile per aggiungere la pagina archivio del custom post type appena creato nel menu.
Inoltre il link deve risultare attivo quando si è sulla pagina. Probabilmente non è possibile, ma esiste qualche plugin per farlo? Non riesco proprio a trovarlo :(
Ho trovato solo questo plugin chiamato Custom Post Type Archives in Nav Menus, che in realtà non fa molto se non aggiungere un link personalizzato al menu..con l'URL completo del sito. Non diventa attivo e non è molto dinamico.
Penso che probabilmente il modo più semplice sarebbe sovrascrivere wp_nav_menu()
e aggiungere manualmente i miei link, poi usare le informazioni di $_GET
per controllare lo stato del "link attivo corrente".

A partire da WordPress 4.4 (dicembre 2015), i link agli archivi dei Custom Post Type sono ora supportati ufficialmente nel core di WordPress senza bisogno di codice di terze parti o plugin aggiuntivi.
Puoi leggere l'intero ticket Trac #16075 per una discussione completa o il post su Make WordPress Core per un riepilogo delle etichette aggiuntive.
Per abilitare il nuovo supporto integrato per i link agli archivi nel menu, i custom post type devono essere registrati con valori non falsi (cioè true) per has_archive
, publicly_queryable
e show_in_nav_menus
:
add_action( 'init', function () {
register_post_type( 'movies',
array(
'labels' => array(
'name' => __( 'Film' ),
'singular_name' => __( 'Film' ),
'archives' => __( 'Film' ),
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'film',
),
)
);
});
Con queste aggiunte, vedrai un nuovo metabox nella schermata di amministrazione Aspetto > Menu.
Il link all'archivio del post type può essere trovato sotto la scheda 'Visualizza tutto' all'interno del metabox del post type:
Nota: Potresti dover aprire il pannello "Opzioni schermo" e assicurarti che il nome degli "Archivi Post Type" (ad esempio Film) sia selezionato per farlo apparire nella schermata dei Menu.

Questo è un metodo che penso dovrebbe funzionare (anche se non è stato testato).
//Aggiungi un hook al filtro per il menu principale (personalizzato)
// 'wp_list_pages' è un fallback, quando non viene utilizzato un menu personalizzato
add_filter( 'wp_list_pages', 'new_nav_menu_items' );
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
//Puoi anche agganciarti a un menu specifico...
//add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );
function new_nav_menu_items($items) {
global $wp_query;
$class ='';
//Verifica se stiamo visualizzando il CPT 'myposttype', in tal caso assegna la classe 'active'
if(isset($wp_query->query_vars['post_type'])&& $wp_query->query_vars['post_type']=='myposttype')
$class = 'current_page_item';
//Genera l'URL della pagina archivio del CPT
$url = add_query_arg('post_type','myposttype',site_url());
$myitem = '<li class="'.$class.'"><a href="'.$url.'">My Custom Post Type</a></li>';
$items = $items . $myitem;
return $items;
}
Questa non mi sembra la soluzione più pulita, ma non conosco altri modi. Se ce ne sono, mi piacerebbe vederli!
Infine, l'URL del link dell'elemento personalizzato non è 'carino' - ma potresti renderlo tale se conosci lo slug del CPT (supponendo che vengano utilizzati permalink personalizzati...)

Grazie per la risposta. Sembra funzionare fondamentalmente. Tuttavia, la formattazione dell'URL necessita di qualche ritocco. E speravo che forse tu conoscessi WordPress meglio di me. Attualmente l'URL è: example.com/?post_type=myposttype ma dovrebbe essere example.com/myposttype. Forse semplicemente $url = site_url() . 'myposttype';
? E le classi non vengono incluse, compresa quella attualmente attiva.

Oh scusa, non avevo visto il $class = '';
. Tuttavia, non posso ottenere le classi normali dinamicamente e anche come fare in modo che il link attualmente attivo funzioni?
