サポート » 使い方全般 » カスタム投稿タイプのsingleへ入れないようにしたい

  • 解決済 muro

    (@muromuro)


    以下のようなコードをfunctions.phpに書いて、カスタム投稿タイプを追加しました。

    function add_posttype() {
    	$post_type = "news";
    	$name = "お知らせ";
    	$singular_name = "お知らせ";
    	$params = array(
    		'labels' => array(
    			'name' => $name,
    			'singular_name' => $singular_name,
    			'add_new' => '新規追加',
    			'add_new_item' => $singular_name.'を新規追加',
    			'edit_item' => $singular_name.'を編集する',
    			'new_item' => '新規'.$singular_name,
    			'all_items' => $singular_name.'一覧',
    			'view_item' => $singular_name.'を表示',
    			'search_items' => '検索する',
    			'not_found' => $singular_name.'が見つかりませんでした。',
    			'not_found_in_trash' => 'ゴミ箱内に'.$singular_name.'が見つかりませんでした。',
    		),
    		'public' => true,
    		'has_archive' => true,
    		'show_ui' => true,
    		'menu_position' => 4,
    		'supports' => array(
    			'title',
    			'editor',
    			'thumbnail',
    		),
    	);
    	register_post_type($post_type, $params);
    }
    add_action('init', 'add_posttype');

    この投稿タイプのarchive.phpやtaxonomy.phpだけ表示できるようにし、single.phpには入れないようにしたいのですが、それは可能でしょうか?
    publicをfalseにすると、管理画面上での投稿一覧でsingleを表示するためのリンクは消えてくれるのですが、公開されている画面上で記事の取得ができなくなってしまいます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • こちらを参考にしました。

    function singular_news_redirect_404() {
    	if ( is_singular( 'news' ) ) {
    		global $wp_query;
    		$wp_query->set_404();
    		status_header( 404 );
    	}
    }
    add_action( 'wp', 'singular_news_redirect_404' );

    トピック投稿者 muro

    (@muromuro)

    返信ありがとうございます。
    しかしこれでは、管理画面の投稿一覧にある、「表示」リンクはそのまま残っています。
    できればこれも非表示にしたいと考えています。

    function remove_view_action_from_news( $actions, $post ) {
    	if ( $post->post_type === 'news' ) {
    		unset( $actions['view'] );
    	}
    	return $actions;
    }
    add_filter( 'post_row_actions', 'remove_view_action_from_news', 10, 2 );

    いかがでせう。

    もし編集画面でのタイトル下、パーマリンク編集部分も気になるのであれば

    add_action( 'edit_form_before_permalink', function( $post ) {
    	if ( $post->post_type === 'news' ) {
    		global $post_type_object;
    		$post_type_object->public = false;
    	}
    } );
    /**
     * @see https://github.com/WordPress/WordPress/blob/4.3-branch/wp-admin/edit-form-advanced.php#L517
     */
    add_action( 'edit_form_after_title', function( $post ) {
    	if ( $post->post_type === 'news' ) {
    		global $post_type_object;
    		$post_type_object->public = true;
    	}
    } );

    で非表示にできます。力技ですが。(上記の書き方は要 PHP >=5.4)

    モデレーター jim912

    (@jim912)

    public を false とし、pre_get_posts で、該当条件の時に post_type に news を含めるという手も考えられます。

    トピック投稿者 muro

    (@muromuro)

    お二人方、ありがとうございます。
    どちらの方法でも、管理画面の一覧と編集からのリンク非表示および、singleに直接アクセスしても404になるようにできました。
    しかしどちらの方法でも、記事を編集したあとに「投稿を更新しました。投稿を表示する」というメッセージはそのまま出てしまい、そこからsingleにアクセスできてしまいます。
    重ねがさね申し訳ないのですが、これも止められないでしょうか?

    > muroさん

    /**
     * @see https://github.com/WordPress/WordPress/blob/4.3-branch/wp-admin/edit-form-advanced.php#L89
     * @see https://github.com/WordPress/WordPress/blob/4.3-branch/wp-admin/edit-form-advanced.php#L129
     */
    add_filter( 'post_updated_messages', function( $messages ) {
    	global $post_type;
    	if ( $post_type === 'news' ) {
    		$messages['post'][1] = '投稿を更新しました。';
    	}
    	return $messages;
    } );

    完璧主義ですね。すてきです。

    > jim912さん

    public を false とし、pre_get_posts で、該当条件の時に post_type に news を含めるという手も考えられます。

    なるほど!
    こんなかんじですか?

    add_action( 'pre_get_posts', function( $query ) {
    	if ( $query->is_main_query() ) {
    		global $wp;
    		if ( $wp->matched_query === 'post_type=news' ) {
    			$query->set( 'post_type', 'news' );
    		}
    	}
    } );

    (public=>falseのとき投稿を表示するが出るの4.4の開発版で修正されたハズ……と思ったら再オープンされてる…… https://core.trac.wordpress.org/ticket/17609

    トピック投稿者 muro

    (@muromuro)

    すみません、返信が遅くなってしまいました。
    更新時のメッセージも変更できました。ありがとうございます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「カスタム投稿タイプのsingleへ入れないようにしたい」には新たに返信することはできません。