Создайте скрытый пользовательский тип сообщения в wordpress - но не полностью - PullRequest
0 голосов
/ 01 августа 2020

Мне нужно зарегистрировать пользовательский тип сообщения, "hidden_cpt", который должен быть:

  • не отображается для publi c сайт
  • нет меню администратора
  • доступен только через query_posts или wp_query
  • виден acf (или аналогичным техническим плагином низкого уровня)

Я попытался провести некоторый тест с аргументами register_post_type, но это либо слишком скрыто или недостаточно ...

У вас есть идея?

Заранее благодарю

РЕДАКТИРОВАТЬ: Я пробовал обойти следующий код, изменив некоторые «истинные» на "false" и наоборот ... но я не все свои тесты вел :-( Этот не самый лучший ...

function register_hidden_cpt() {
    $labels = [
        "name" => __("HCPT", "hidden_cpt"),
        "singular_name" => __("HCPT", "hidden_cpt"),
        "menu_name" => __("HCPT", "hidden_cpt"),
    ];
    $args = [
        "label" => __("HCPT", "hidden_cpt"),
        "labels" => $labels,
        "public" => true,
        "publicly_queryable" => true,
        "show_ui" => true,
        "show_in_rest" => true,
        "rest_base" => "",
        "rest_controller_class" => "WP_REST_Posts_Controller",
        "has_archive" => true,
        "show_in_menu" => true, 
        "show_in_nav_menus" => true,
        "delete_with_user" => false,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => false,
        "query_var" => true,
        "supports" => ["title", "editor", "thumbnail"],
    ];
    register_post_type("hidden_cpt", $args);
}
add_action('init', 'register_hidden_cpt');

1 Ответ

1 голос
/ 01 августа 2020
function register_hidden_cpt() {
    $labels = [
        "name" => __("HCPT", "hidden_cpt"),
        "singular_name" => __("HCPT", "hidden_cpt"),
        "menu_name" => __("HCPT", "hidden_cpt"),
    ];
    $args = [
        "label" => __("HCPT", "hidden_cpt"),
        "labels" => $labels,
        "public" => true, // for acf
        "publicly_queryable" => true,
        "show_ui" => false,
        "show_in_rest" => false,
        "rest_controller_class" => "WP_REST_Posts_Controller",
        "has_archive" => true,
        "show_in_menu" => false, 
        "show_in_nav_menus" => false,
        "delete_with_user" => false,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => false,
        "query_var" => true,
        "supports" => ["title", "editor", "thumbnail"],
    ];
    register_post_type("hidden_cpt", $args);
}
add_action('init', 'register_hidden_cpt');

Обратитесь к https://developer.wordpress.org/reference/functions/register_post_type/

Некоторые значения массива являются «родителями» для других значений, которые, если родители ложны, вам не нужно включать дочерний элемент (если вы не хотите, чтобы дочерний аргумент явно переопределил значения по умолчанию). Внимательно посмотрите на справочную страницу выше, прочтите описания того, что они делают, и вы сможете очистить код еще больше в соответствии со своими требованиями. Почти все доступно через wp_query, но у меня нет доступа к acf, поэтому младенец предоставит какое-либо представление об этом запросе.

Надеюсь, это помогло. Удачи!

Обновление

Это было бы хорошей идеей спросить на форумах ACF. Вы также можете сделать условие в любой дополнительной функции, которую вы пишете, или сделать ее скрытой для кого-либо, кроме администраторов? например, сделать его publi c для acf, но затем скрыть его в любой написанной вами функции? Я нашел этот пример на stackexchange - https://wordpress.stackexchange.com/questions/28782/possible-to-hide-custom-post-type-ui-menu-from-specific-user-roles

Кредит: @Milo (StackExchange)

Чтобы скрыть пункт меню типа сообщения от пользователей без прав администратора:

function wpse28782_remove_menu_items() {
    if( !current_user_can( 'administrator' ) ):
        remove_menu_page( 'edit.php?post_type=your_post_type' );
    endif;
}
add_action( 'admin_menu', 'wpse28782_remove_menu_items' );

your_post_type должно быть именем вашего фактического типа сообщения.

...