WordPressメニューにカスタム投稿タイプのアーカイブを追加する


10

WordPressのメニューにカスタムポストタイプアーカイブを追加する方法(カスタムリンクを追加する以外)はありますか?カスタムリンク(/ cpt-archive-slug /など)を使用して追加された場合、WordPressはcurrent-menu-itemリスト要素のようなクラスを適用しないため、メニューのスタイル設定時に問題が発生します。

カスタムリンクにURL全体(例:http : //site.com/cpt-archive-slug/)が含まれている場合、それらのクラスが追加されます。ただし、これはおそらく「ベストプラクティス」ではありません。

回答:


5

カスタム投稿タイプのアーカイブは、分類ベースのアーカイブ(カテゴリ、タグ、任意のカスタム分類)と独自のアーカイブスラッグを持つ日付ベースのアーカイブとは異なるため、完全なURLのカスタムリンクが最適です。


6

私はこれが古いことを知っていますが、私にもこの問題があり、カスタムメニューウォーカーを使用することで対処するかなりクリーンな方法を見つけました

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(),
));

注:これは、投稿タイプのスラッグと名前が同じであることを前提としています。


質の悪い回答の+1。これはコミュニティにとって良いことです。
Brian Fegter 2012

2

Tungdの回答を少し拡張して、そのアプローチでより一般的なものを提供します。この実装により、メニュー「マクロ」とバックエンドのみが認識している内部のWordpress URLとの間に任意のマッピングを追加できます。

!名前付きアンカーとの競合を回避するために、これらのマクロのプレフィックスとして使用することも決定しました-これには、リンクURLから「http://」を取り除くオーバーヘッドが含まれます(Wordpressがこれらの奇妙なリンクを正規化しようとするため) 。その実装が気になる場合は、いつでも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'));

1

ページを作成して、それにカスタムアーカイブテンプレートを適用できます。デフォルトのアーカイブの場合と同じように、テンプレート名を指定してarchive- {post-type} .phpを作成して使用します。手動でページに適用します。

これを行う場合は、CPTをhas_archive = 'false'に設定して、パーマリンクの衝突を回避することをお勧めします。ページに、CPTアーカイブスラグが設定されているものとは異なるパーマリンクスラグがあることを確認してください。



0

新しい「親」投稿タイプを作成する必要があると思うので、表示したいカスタム投稿タイプが「子」になり、その親がメニ​​ューにリストされます。

これはオプションである必要があります。メニューにリストするためだけにダミーの親を作成するのは、大変な作業です。

テンプレートまたは関数から実行する方法が欲しいので、マルチサイトインストールの各サイトの各メニュー設定で実行する必要はありません。


1
つまり、メニューに表示したいカスタム投稿タイプの投稿は、新しく作成された親の唯一のサブタイプであり、メニュー設定の親の下にリストされていることを願っています。
sergio 2011


0

リンクを追加する代わりに、空のページを作成しています。そのページで、「コンテンツは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 );

これにより、メニュー/ページのタイトルと、カスタム投稿タイプのアーカイブまたは個々のページが実際に表示されているかどうかが確認されます。trueの場合は、current-menu-itemクラスを追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.