私が設定したもの
私は3つのカスタム投稿タイプを持っています、それらは "ブランド"、 "キャリア"、および "ニュース"という名前です。
私は3つのページテンプレートを持っていて、それらは "page-brand"、 "page-careers"、そして "page-news"という名前です。
これらのテンプレートを使用して作成したページでは、同じ名前のカスタム投稿に対してクエリが実行されます(つまり、私の "News"ページにはすべての "news"カスタム投稿が一覧表示されます)。
私のカスタム投稿タイプのナメクジは、「ブランド」、「キャリア」、および「ニュース」です。
私のページのURLは以下のとおりです。
www.example.com/our-brands/
www.example.com/our-careers/
www.example.com/our-news/
ページ自体にカスタム投稿タイプと同じスラッグを付けることはできない、またはWordPressが混乱して404エラーが発生し始めることがわかっているので、これらのスラッグをページに付けました。
私の問題
自分のページのパーマリンク、および自分のカスタム投稿のパーマリンクは機能しますが、正しい親ページのURLを取得するためのブレッドクラムを取得できません。
たとえば、www.example.com/our-news/
にアクセスしてそこにリストされている「ニュース」投稿をクリックすると、結果のURLはwww.example.com/news/example-news-custom-post/
になります。
このため、私のブレッドクラムは "Home"News"Example News Custom Post"として表示されます。ブレッドクラムを使用して前に戻って[ニュース]リンクをクリックすると、www.example.com/news/
が存在しないため404エラーが発生します。
試したことのあるもの
書き換えスラッグが作成したページのURLと一致するように、書き換え引数(投稿タイプの登録時に使用可能)を変更して、これを解決しようとしました。
'rewrite' => array(
'slug' => 'our-news',
'with_front' => true,
'pages' => true,
'feeds' => true,
),
もちろん、これはうまくいきませんでした。WordPressが混乱し、私の "News"ページが404エラーを出し始めたからです。
次に作成したページのIDを使用してカスタム投稿の親として指定し、カスタム投稿の種類を親ページにするメタボックスを作成しました。
function rmm_add_meta_box() {
$screens = array( 'brands', 'news' , 'careers');
foreach ( $screens as $screen ) {
add_meta_box(
'custom_post_parent',
'Enter Post Parent ID',
'rmm_add_meta_callback',
$screen,
'side'
);
}
}
add_action( 'add_meta_boxes' , 'rmm_add_meta_box' );
function rmm_add_meta_callback( $post ) {
wp_nonce_field( basename( __FILE__ ), 'rmm_meta_nonce');
$custom_post_id = get_post_custom($post->ID);
$parent_id = $custom_post_id['parent_id'][0];
$rmm_stored_meta = get_post_meta( $custom_post_id );
?>
<input type="text" id="parent_id" name="parent_id" value="<?php if ( ! empty( $rmm_stored_meta['parent_id'] ) ) echo esc_attr( $rmm_stored_meta['parent_id'][0] ) ; ?>" />
<?php
}
function rmm_meta_save( $post ){
$is_autosave = wp_is_post_autosave( $post_id );
$is_revision = wp_is_post_revision( $post_id );
$is_valid_nonce = ( isset( $_POST[ 'rmm_meta_nonce' ] ) && wp_verify_nonce( $_POST[ 'rmm_meta_nonce' ], basename( __FILE__) ) ) ? 'true' : 'false';
if ( $is_autosave || $is_revision || !$is_valid_nonce){
return;
}
$data = sanitize_text_field( $_POST['parent_id'] );
if ( isset( $_POST['parent_id'] ) ) {
update_post_meta($post_id, 'parent_id', $data);
}
}
add_action( 'save_post', 'rmm_meta_save');
これにより、「ニュース」スラッグが「ニュース」スラッグに追加されました。言い換えれば、www.example.com/news/example-news-custom-post/
は単にwww.example.com/our-news/news/example-news-custom-post/
になりました。私のブレッドクラムで、www.example.com/our-news/news/
というURLを持つ親ページに誘導されました(もちろん存在しません)。
私のブレッドクラムが存在しないページのURLへの誘導を停止するように、私のカスタム投稿URLをwww.example.com/our-news/
として、私の親ページのURLをwww.example.com/our-news/example-news-custom-post
にする方法を知りたいです。
投稿タイプを登録するときに "has archive"を "true"に設定してもWordPressが自動的にカスタム投稿タイプのアーカイブページを生成することはありませんでした。
傷ついたもの
登録した「ブランド」、「キャリア」、および「ニュース」のカスタム投稿タイプ用にカスタマイズしたarchive-{slug}.php
テンプレートを私のテーマファイルに作成しました。それが済んだら、私は私のテーマをアップロードし、カスタムリンクオプションを介して私のナビゲーションメニューにパーマリンク(WordPressが各アーカイブページに対して自動的に生成する)を追加しました。これにより、正しいURLのwww.example.com/news/
を含むページ、正しいURLのwww.example.com/news/example-news-custom-post
を含む投稿、および投稿のタイトルの前に「ニュース」と表示されたパンくずリストが表示されます。