WordPressのメニューにカスタム投稿タイプのアーカイブを追加する方法は(カスタムリンクを追加する以外に)ありますか?カスタムリンク(例:/ cpt-archive-slug /)を使用して追加された場合、WordPressはcurrent-menu-item
のようなクラスをリスト要素に適用しません。これはメニューのスタイルを設定するときに課題があります。
カスタムリンクにURL全体が含まれている場合(例: http://site.com/cpt-archive-slug/ )、これらのクラスが追加されます。しかし、それはおそらく「ベストプラクティス」ではありません。
カスタム投稿タイプのアーカイブは、分類基準ベースのアーカイブ(カテゴリ、タグ、カスタム分類基準)と日付ベースのアーカイブで、独自のアーカイブスラッグがあるため、完全なURLを使用したカスタムリンクが最適です。
私はこれが古いことを知っていますが、私もこの問題を抱えています、そしてそれを処理するためのかなりきれいな方法はカスタムメニューウォーカーを使うことであることがわかりました
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;
}
}
URLが#post_type_album
のカスタムリンクメニュー項目があるので、これを次のように使用できます。
# 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(),
));
注:これはあなたの投稿タイプのスラッグと名前が同じであると仮定しています。
tungdの答え をもう少し拡張して/ /そのアプローチでより一般的なものを提供します。この実装では、メニューの「マクロ」とバックエンドだけが知っている内部のWordpress URLの間に任意のマッピングを追加することができます。
また、名前付きアンカーと衝突しないように、これらのマクロの接頭辞として!
を使用することにしました。これには、リンクURLから「http://」を削除するためのオーバーヘッドが含まれます。 )その実装が気になる人は、preg_replace()
呼び出しを取り除き、#
をリンクプレフィックスとして使うことができます。
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'));
ページを作成し、それにカスタムアーカイブテンプレートを適用することができます。デフォルトのアーカイブと同じようにテンプレート名にarchive- {post-type} .phpを作成して使用します。手動でページに適用します。
これを行う場合は、パーマリンクの衝突を回避するために、CPTをhas_archive = 'false'に設定することをお勧めします。ただし、ページのパーマリンクスラッグがCPTアーカイブスラッグとは異なることを確認してください。
私は同じ正確な問題に出くわし、そしてこの解決策を見つけました:
// $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 );
ソース: http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html
私は同様の問題を探すときにこの答えを見つけました。私はちょうど私のfinctions.phpファイルにコードをコピーして、それは箱から出してすぐにうまくいきました:)それが役立つことを願っています!
私は新しい "親"ポストタイプを作成しなければならないと思うので、表示したいcustom-post-typeが "子"になり、その親がメニューに表示されます。
これはオプションです。メニューに表示するためだけにダミーの親を作成するのはやり過ぎです。
テンプレートまたは機能からそれを実行する方法が欲しいので、私は私のマルチサイトインストールの各サイトのための各メニュー設定でそれをする必要はありません。
リンクを追加する代わりに私がすることは空のページを作成することです。そのページで私は私のクライアントがすべてのものがどこから来ているのかを知ることができるようにエディタに "cpt-nameから生成されたコンテンツ"のような何かを追加します。
そのページをメニューに追加し、次のコードを使用してarchives-cptまたは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 );
これはメニュー/ページタイトル、そして私たちが実際にアーカイブかカスタム投稿タイプの個々のページを見ているかどうかをチェックします。もしそれが本当なら、current-menu-itemクラスを追加します。