私のWordPressプロジェクトには、いくつかの異なるcustom post types
があり、それらはすべて common taxonomyを共有しています。私はプロジェクトの最終段階にあり、今はサイドバーウィジェットを使ってすべてのカスタム投稿タイプをリンクする時が来ました。私が抱えている問題は、私がterm link
を正しいカスタム投稿タイプにリンクさせるための適切な方法を知らないということです。
たとえば、書籍、作者、商品などのカスタム投稿タイプがあります。分類法:ホラーカテゴリを含むジャンル。
私はそのようなリンク構造を手に入れたいです。
/book/genre/horror
/product/genre/horror
/author/genre/horror
私がget_term_link('horror');
をするとき、私は用語リンクの1つを得ます、それはカスタム投稿タイプの1つが好みを持っているようです。正しいカスタム投稿タイプに対応する各用語リンクを取得する方法を教えてください。
ハードコーディングするのは良い考えではないので、これについて正しい方法があるかどうか私は思っていました。これは私が抱えている古い問題であり、解決策を探すために多くのことを行ってきましたが、私はそれを見つけることができませんでした。私は最後の手段としてここに来ます。ありがとう。
このコードは、 ジャンル分類法 for カスタム投稿タイプbook のすべてのカテゴリのすべての投稿を表示します。さて、異なる カスタム投稿タイプ(作者、商品)に対しては、WP_Query()の$ arg内でカスタム投稿タイプ名を変更する必要があります。 get_term_link($ catterm)関数を使ってterm linkを取得するか、または get_the_term_list() を使うこともできます。
$args = array(
'number' => $number,
'hide_empty' => $hide_empty,
'include' => $ids
);
$custom_categories = get_terms( 'genre ', $args );
foreach ( $custom_categories as $catterm){
$arg = Array(
'post_type' => 'book',
'posts_per_page' => '-1',
'post_status' => 'publish',
'tax_query' => Array( Array (
'taxonomy' => 'genre ' ,
'terms' => $catterm->term_id
)) );
$loop = new WP_Query( $arg );
global $post;
while ( $loop->have_posts() ) : $loop->the_post();
?>
<div class="gallery-content">
<div class="entry-content">
<?php
echo '<li>' . get_the_title() . '</li>';
echo '<li><a href="'.get_term_link($catterm).'">'.$catterm->name.'</a></li>';
?>
</div>
</div>
<?php endwhile;
}
?>
良い知らせ、私はこれを達成する方法を考え出しました。これが私の解決策です。
上記の例を取り上げて、example.com/book/genre/horror
をカスタム投稿タイプbook
、分類法genre
、およびカテゴリhorror
を指すようにするために行ったことを説明します。
かなりパーマリンクを有効にする必要があります。それを有効にするためにSettings> Permalinksに行きます。そうでなければ、これを行う意味はありません。だからここに行きます...
1)book(およびslug book)というページを作成し、それを公開した後にそのページ用に生成されたページIDを書き留めます。これが必要になります(これはURLに表示されます。ページID付きの?post=
になります)。その中に。)
2)リンクを正しいテンプレートページに向けることができるように、書き換えを作成する必要があります。それで、あなたのfunctions.php
ファイル(またはあなた次第のあなたのプラグインファイル)に、あなたはこのコードを追加する必要があります:
function my_rewrite_rules() {
add_rewrite_rule(
'book/genre/([[A-Za-z0-9\-]+)?/?$',
'index.php?page_id=1234&genre=$matches[1]',
'top'
);
flush_rewrite_rules();
}
add_action( 'init', 'my_rewrite_rules' );
ここで、1234をbook
ページ用に生成したページIDに置き換えます。そして任意のフロントエンドページに行き、それをリロードしてください。
重要: あなたのサイトにページがロードされる度にflush_rewrite_rules();
を実行したくないでしょう。これは重い機能であり、あなたのために物事を遅くします。 フロントエンド で一度だけ実行する必要があります。フロントエンドのページをリロードすると、書き換えルールが消去され、この行を削除できます。
この関数が行うことは、URLが/book/genre/ANYTHING_HERE/
の構造を持っている場合、WordPressはデータgenre=ANYTHING_HERE
を持つID 1234のページにユーザーをリダイレクトします。 ANYTHING_HEREは、提供されている正規表現でフィルタリングされます。これは、aからzまでの文字(大文字と小文字)、数字の0から9、ダッシュ( - )のみを受け入れます。
3)テーマフォルダに移動してpage-1234.php
というファイルを作成します(もちろん、1234を your page IDに置き換えます)。このファイルでは、さまざまな種類の楽しいことを実行できます。すべての本を一覧表示する方法は次のとおりです。 genre :
<?php
get_header();
global $wp_query;
$genre = $wp_query->query_vars['genre'];
$args = array(
'post_type' => 'book',
'tax_query' => array(
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => $genre,
), ),
);
$books = new WP_Query( $args );
?>
<h1>Books of <?php echo $genre;?></h1>
<ul>
<?php foreach ( $books as $book ) : ?>
<li><?php echo $book->post_title; ?></li>
<?php endforeach; ?>
</ul>
<?php get_footer(); ?>
さらに、この例のgenre
のように分類法を使用していない場合は、カスタムタグを使用できます。ちなみに、この例ではgenre
という用語は分類法として登録されているためだけに機能します。そうでない場合は、functions.php
に次のように追加することで、WordPressに新しいタグを追加できます。
function custom_rewrite_tag() {
add_rewrite_tag('%food%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
これで、ステップ2のgenre
をタグfood
に置き換えます。 page-1234.php
では、query_vars['food']
を取得して好きなように操作し、example.com/book/food/chocolate
のようなリクエストを実行できます。いくつかのquery_varsは予約されていることに注意してください。下記のリソースをチェックしてください。
最後に、リンクが正しいカスタム投稿タイプと分類法を指すようにするには、カスタム関数が必要です。これが私がこれを行うことを考えることができる唯一の方法であり、それはこのようなものです:
function get_books_category_link( $category_slug ) {
$page = get_permalink( 1234 );
$link = '';
if ( '/%postname%/' == get_option('permalink_structure') ) {
$link = $page . 'genre/' . $category_slug;
} else {
$link = add_query_arg( array( 'genre' => $category_slug ) , $page );
}
return $link;
}
以上です!それが役に立てば幸い。以下のいくつかの素晴らしい記事、特にStephen Harrisによる記事は書き換えAPIの理解に大きな違いをもたらしました。ありがとう。