カスタムpost_typeのアーカイブURLを取得


26

ばかげた質問のようです。しかし、私はそれを理解することはできません:(。

自宅でカスタムpost_typeのアーカイブURL(archive- {post_type} .php)に移動するボタンを表示する必要があります。それ、どうやったら出来るの?


どのような種類のボタン、ナビゲーションメニューに追加するか、または一般的なリンクですか?通常、アーカイブURLは、yoursite.com/type-slug明示的に別のものに設定しない限り、たとえば yoursite.com/some-other-url..
t31os

@ t31os:うん、今、そのようにハードコーディングしました。しかし、すぐに@Mikeのコードを使用して変更します。
-ariefbayu

回答:


25

こんにちは@Silent:

WordPress 3.1には、希望どおりに機能する関数があり、その名前が付けられていget_post_type_archive_link()ます。呼び出す方法は次のとおりです(という名前のカスタム投稿タイプを想定'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>

以下は、WordPressにこのユースケース用の機能が実際に組み込まれていることを発見する前の私の以前の回答です。

事前回答:

WordPress 3.1のコアソースコードで何かを見落としていなければ、次のようget_archive_link()に呼び出す関数を探していると思います(という名前のカスタムポストタイプを想定しています'product')。

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

そして、ここにあなたが書いているかもしれないプラグインのためにあなたのテーマのfunction.phpファイルまたはファイルに置くことができるソースコードがあります.php

if (!function_exists('get_archive_link')) {
  function get_archive_link( $post_type ) {
    global $wp_post_types;
    $archive_link = false;
    if (isset($wp_post_types[$post_type])) {
      $wp_post_type = $wp_post_types[$post_type];
      if ($wp_post_type->publicly_queryable)
        if ($wp_post_type->has_archive && $wp_post_type->has_archive!==true)
          $slug = $wp_post_type->has_archive;
        else if (isset($wp_post_type->rewrite['slug']))
          $slug = $wp_post_type->rewrite['slug'];
        else
          $slug = $post_type;
      $archive_link = get_option( 'siteurl' ) . "/{$slug}/";
    }
    return apply_filters( 'archive_link', $archive_link, $post_type );
  }
}

私は実際に週末にこの正確なロジックに取り組んでいましたが、特定のサイトではおそらく動作しますが、WordPressが見る可能性のあるすべてのユースケースでロジックの順序が一般的に正しいとはまだ100%確信していません。

これは、tracを介してWordPressに追加することをお勧めする素晴らしいことです。


ところで、tracを送信するときに、ここにリンクしてください。
アリエフバユ

@silent-はい、もちろん。
MikeSchinkel

@Mike-あなたがそうしなかったら似たようなものを書いていたはずです...;)これが@silentが念頭に置いていたものかどうか疑問に思っていましたが、ボタンの言及は私に何か他のものを考えさせました..
t31os

@ t31os-今週末、URLルーティングプラグインと同じロジックに取り組んでいたので、順調にスタートしました。:)ボタンについては、それに対処するための答えを追加できますか?
MikeSchinkel

カバーするものが残っているか本当に
わかり

12

投稿タイプを登録するとき、「has_archive」パラメータを使用して文字列をスラッグとして渡し、rewriteをtrueまたは配列に設定しますが、falseには設定しないでください。CPTアーカイブURLはhttp://www.YOURDOMAIN.comになります。 / has_archive_slugたとえば

例えばregister_post_typeで設定した場合:

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => 'product',
    'capability_type' => 'post',
    'has_archive' => 'products', 
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ); 
 register_post_type('product',$args);

単一のURLは http://www.YOURDOMAIN.com/product/postName で、アーカイブURLはhttp://www.YOURDOMAIN.com/products/です


3
やったー 私はいつもhas_archiveブール値だと思っていましたが、文字列を与えることができるようになったので、単一のカスタム投稿タイプにrecipe複数のスラッグを/recipes/
含める

彼らが切り替えをしたかどうか/いつ行ったか、またはこれが常にエラーであったかどうかは覚えていませんが、2017年に'rewrite'はブール値または配列値のみを受け入れます。むしろ'rewrite' => 'product',あなたが列挙されている、それは代わりにする必要があります'rewrite' => array( 'slug' => 'product' ),
マイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.