Як відключити єдиний вигляд для користувацького типу публікації?


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
Річард

2
чому б не використовувати тільки is_singular('post-type-slug')в if()умові замість 2 умов?
Акаш К.

@AkashK. Так, це також може працювати, не знав про функцію.
Кумар

75

Просто встановлення аргументу

'publicly_queryable'  => false

коли ви телефонуєте register_post_type ()


1
Це виглядає як відповідь на те, щоб зупинити ваш CPT від створення фактичних веб-сторінок, зберігаючи всі посилання на бази даних.
Бен Рачикот

27
Тут ховається і архів
космічний

1
Це має бути прийнятою відповіддю.
SinisterBeard

Для мене це спричиняє переспрямування на домашню сторінку замість 404. Будь-які ідеї чому? Я реєструю post_type у Piklist, якщо це актуально.
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

Це не працює для мене. Він намагається переспрямувати назад на головну сторінку при спробі перейти до архіву
Yahya Uddin

7

Один. З файлу ваших функцій.

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

Мені сподобався другий варіант. Але мені потрібно знати, чи є недолік у цього другого варіанту.
користувач2584538

@ user2584538 Якщо у вас немає спеціального single-cpt_name.phpфайлу, ви не могли б це зробити. Якщо ви помістите цю функцію у простий плагін, ви можете активувати / деактивувати, не редагуючи жодного файлу.
EliasNS

2

Працюючи з справді доброї відповіді Свена, я переписав його функцію, щоб полегшити додавання декількох типів публікацій, використовуючи in_array()в операторі if, а потім переадресацію на сторінку архіву замість домашньої сторінки.

(до речі, я думаю, що налаштування query_varта / або publically_queryableхибність відключать не тільки окремі представлення даних, але й перегляд власного архіву, переосмисливши '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_queryableпомилку, ваші архіви будуть переспрямовані додому, будь-яка інша комбо-робота не буде. Встановіть значення query_varfalse, і це все.

Ось повний 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 або булева помилка, WordPress все ще намагатиметься інтерпретувати його (4.2.2), а попередній перегляд / перегляд вашого користувацького повідомлення поверне 404s.


Це трохи схоже на злом, але, здається, працює. Хочеться, щоб вони просто додали виділений властивість has_single разом із існуючим властивістю has_archive.
powerbuoy

0

У випадку, якщо ви хочете повністю відключити спеціальний вид публікації на одній панелі інтерфейсу, але зможете відобразити сторінку архіву, все стає дещо складнішим.

Установка publicly_queryableдля falseабо rewriteв 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' );

Ще один бонус полягає в тому, що відтепер ви можете створювати прості сторінки WordPress, використовуючи структуру постійної посилання типу події ( event/simple-page), яка може бути корисною для складних веб-сайтів.

Пам’ятайте про те, щоб змити правила переписання після зміни коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.