web-dev-qa-db-ja.com

カスタム投稿タイプのシングルビューを無効にする方法

カスタム投稿タイプを作成しました。

register_post_type('sample_post_type',array(
    'labels' => array(
        'name' => _x('Sample Posts', 'post type general name'),
        'singular_name' => _x('Sample Post', 'post type singular name')
    ),
    'public' => true,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));

この特定の投稿タイプの単一投稿ビューを無効にする方法単純な404を表示するのは問題ありません、またはホームページにリダイレクトします。これはプラグインの中なので、空のページを設定するためのsingle-sample_post_type.phpファイルを作成することはできません。

44
passatgt

カスタム投稿タイプにリダイレクトするにはtemplate_redirectフックを使用できます。home_url()の代わりに他のURLを使用し、他の引数にエラーコードを使用できます。

<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  $queried_post_type = get_query_var('post_type');
  if ( is_single() && 'sample_post_type' ==  $queried_post_type ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

更新しました:

別の方法は、@ gustavoが前述したようにカスタム投稿を登録しながら'publicly_queryable' => falseを設定することです。しかし、それは404を直接あなたに与えるだけです、それは基本的にフロントエンドから完全に隠されていて、カスタム投稿のためにのみ設定することができます。

35
sven

引数を設定するだけ

'publicly_queryable'  => false

register_post_type()を呼び出したとき

65
Gustavo

そのためのより簡単な方法は、カスタム投稿タイプを登録するときに次の引数を渡すことです。

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Sample Posts', 'post type general name'),
    'singular_name' => _x('Sample Post', 'post type singular name')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));
8
0v3rth3d4wn

1。 あなたの機能ファイルから。

add_action( 'template_redirect', 'redirect_cpt_singular_posts' );
    function redirect_cpt_singular_posts() {
      if ( is_singular('your-cpt-slug') ) {
        wp_redirect( home_url(), 302 );
        exit;
      }
    }

二。 single.cpt.phpファイルから:

<?php wp_redirect( home_url() ); exit; ?>
7
Brad Dalton

Svenの本当に良い答えから作業して、私はifステートメントでin_array()を使って複数の投稿タイプを追加し、そしてホームページの代わりにアーカイブページにリダイレクトすることをより簡単にするために彼の機能を書き直しました。

(ところで、query_varpublically_queryableをfalseに設定すると、単一のビューだけでなくネイティブのアーカイブビューも無効になり、'has_archive' => trueをオーバーライドすることになります。その場合でも、カスタムWP_queryを設定して独自のアーカイブを作成できます。ページでは、テンプレートで、しかし、メインのクエリはそれ以上それをしないでしょう、それ?

function fq_disable_single_cpt_views() {
  $queried_post_type = get_query_var('post_type');
  $cpts_without_single_views = array( 'my-post-type', 'my-other-post-type' );
  if ( is_single() && in_array( $queried_post_type, $cpts_without_single_views )  ) {
    wp_redirect( home_url( '/' . $queried_post_type . '/' ), 301 );
    exit;
  }
}

add_action( 'template_redirect', 'fq_disable_single_cpt_views' );
2
slashbob

上記のものすべてをテストしたので、実際の解決方法は、どのリダイレクトよりも簡単です。

アーカイブにアクセス可能にしてアイテムをリストアップするために、そして単一ポストnotにアクセス可能にして404セットに自動リダイレクトする

'query_var' => false

cPTを登録するときpublicly_queryableをfalseに設定すると、アーカイブはホームにリダイレクトされ、他のコンボは機能しません。 query_varをfalseに設定してください。

これが完全なCPTです https://Gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

50行目を参照 https://Gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

ここに述べたように

https://codex.wordpress.org/Function_Reference/register_post_type

注:query_varが空、null、またはブール値のFALSEの場合でも、WordPressはそれを解釈しようとし(4.2.2)、カスタム投稿のプレビュー/ビューは404を返します。

2
Benn