カスタム投稿タイプの単一ビューを無効にする方法は?


47

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

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ファイルを作成することはできません。

回答:


43

template_redirectフックを使用してカスタムの投稿タイプにリダイレクトしたり、代わりに使用したい他のURLを使用しhome_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;
  }
}
?>

更新しました:

別のアプローチは以下を設定することです:

'publicly_queryable'  => false`

先ほど@gustavoが述べたように、カスタム投稿を登録します。しかし、ページを完全に削除し、404ページにリダイレクトします。また、単一のアーカイブページだけでなく、基本的にフロントエンドから完全に隠されたカスタムページのみを非表示にできます。

^このアプローチは、管理者/バックエンドでのみ使用するカスタム投稿を登録する場合に機能します


良い解決策。get_current_user_id()0に評価されるかどうかを確認することにより、認証されていないユーザーに対してのみこのリダイレクトを実行すると役立つことがわかりました
。– RevNoah

2
回答フォーム@Gustavo
Richard

2
なぜだけでは使用しないis_singular('post-type-slug')if()2つの条件の代わりに条件?
アカシュK.

@AkashK。ええ、同様に機能しますが、機能を認識していませんでした。
クマール

75

引数を設定するだけ

'publicly_queryable'  => false

register_post_type()を呼び出すとき


1
これは、すべてのデータベース参照を作成しながらCPTが実際のWebページを作成しないようにする答えのように見えます。
ベンラシコット

27
これによりアーカイブも非表示になります
スペース

1
これは受け入れられた答えでなければなりません。
SinisterBeard

私にとって、これは404ではなくホームページへのリダイレクトを引き起こします。何かアイデアはありますか?関係がある場合に備えて、Piklistにpost_typeを登録しています。
emersonthis

8

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

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

1
publically_querable投稿タイプアーカイブが機能するには、実際に真実である必要があります。
Howdy_McGee

これはうまくいきません。アーカイブにアクセスしようとすると、ホームページにリダイレクトされます
ヤヒヤウッディン

7

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; ?>

私は2番目のオプションが好きでした。しかし、この2番目のオプションには欠点があることを知っておく必要があります。
user2584538

@ user2584538カスタムsingle-cpt_name.phpファイルがない場合は実行できません。関数を単純なプラグインファイルに入れると、ファイルを編集せずにアクティブ化/非アクティブ化できます。
エリアスNS

2

Svenの非常に良い答えからin_array()、ifステートメントで複数の投稿タイプを追加し、ホームページではなくアーカイブページにリダイレクトしやすくするために、彼の機能を書き直しました。

(ちなみに、設定query_varpublically_queryablefalseを設定すると、単一のビューだけでなく、ネイティブのアーカイブビューも無効になります'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

上記のすべてをテストしましたが、実際の解決策は、推奨されるリダイレクトよりも簡単です。

アーカイブにアクセスしてアイテムを一覧表示し、単一の投稿にアクセスでき、404セットに自動リダイレクトするため

'query_var' => false

CPTを登録するとき。publicly_queryablefalseに設定すると、アーカイブホームにリダイレクトされ、他のコンボは機能しません。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を返します。


ハックのように感じますが、うまくいくようです。代わりに、既存のhas_archiveプロパティとともに専用のhas_singleプロパティを追加したいだけです。
パワーブイ

0

フロントエンドでカスタム投稿タイプの単一ビューを完全に無効にし、アーカイブページを表示できるようにする場合は、少し複雑になります。

設定publicly_queryablefalserewriteにはfalse両方のシングルとアーカイブのビューを表示するために防ぐことができます。register_post_type関数の引数には、単一のビューの書き換えルールのみの作成を防ぐためのフラグはありません。

https://github.com/WordPress/WordPress/blob/5.2.3/wp-includes/class-wp-post-type.php#L540

ただし、投稿タイプの登録後に書き換えタグを削除できます。これにより、アーカイブビューの書き換えルールは変更されず、単一のビューの書き換えルールのみが削除されます。

/**
 * Register event post type
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Events' ),
        'singular_name' => __( 'Event' ),
        'add_new' => __( 'Add new' ),
        'add_new_item' => __( 'Add new' ),
        'edit_item' => __( 'Edit' ),
        'new_item' => __( 'New' ),
        'view_item' => __( 'View' ),
        'search_items' => __( 'Search' ),
        'not_found' => __( 'Not found' ),
        'not_found_in_trash' => __( 'Not found Events in trash' ),
        'parent_item_colon' => __( 'Parent' ),
        'menu_name' => __( 'Events' ),

    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title', 'page-attributes' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'event'),
        'capability_type' => 'post',
    );

    register_post_type( 'event', $args );
    remove_rewrite_tag( '%event%' ); // This line will remove event rewrite rules for single view
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

もう1つのボーナスは、これからはevent/simple-page、複雑なWebサイトで役立つイベントポストタイプのパーマリンク構造()を使用して簡単なWordPressページを作成できることです。

コードの変更後は、書き換えルールをフラッシュすることを忘れないでください。

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