Cum să eliminăm tipul implicit de postare din bara de administrare
Configurăm un WordPress nou pentru a utiliza tipuri de postări personalizate și dorim ca editorii noștri să se conecteze și să vadă doar tipurile de postări personalizate, nu tipul implicit de postare 'post'. Am reușit să eliminăm 'post' din meniul Admin folosind această metodă, dar asta lasă încă butonul "+ Nou" din bara de administrare, care conține o opțiune de postare și în mod implicit creează o postare. Există o modalitate simplă și sigură de a elimina postarea din butonul nou din bara de instrumente și/sau de a ascunde butonul nou din bara de instrumente?

Trebuie să folosești 3 acțiuni (hooks) diferite pentru a ascunde complet tipul de postare implicit. Totuși, accesul direct la postarea implicită prin URL rămâne posibil. Deci, să începem.
Meniu Lateral
add_action( 'admin_menu', 'remove_default_post_type' );
function remove_default_post_type() {
remove_menu_page( 'edit.php' );
}
Legătura + New > Post din Bara de Administrare
add_action( 'admin_bar_menu', 'remove_default_post_type_menu_bar', 999 );
function remove_default_post_type_menu_bar( $wp_admin_bar ) {
$wp_admin_bar->remove_node( 'new-post' );
}
Legătura + New din Bara de Administrare
function remove_add_new_post_href_in_admin_bar() {
?>
<script type="text/javascript">
function remove_add_new_post_href_in_admin_bar() {
var add_new = document.getElementById('wp-admin-bar-new-content');
if(!add_new) return;
var add_new_a = add_new.getElementsByTagName('a')[0];
if(add_new_a) add_new_a.setAttribute('href','#!');
}
remove_add_new_post_href_in_admin_bar();
</script>
<?php
}
add_action( 'admin_footer', 'remove_add_new_post_href_in_admin_bar' );
function remove_frontend_post_href(){
if( is_user_logged_in() ) {
add_action( 'wp_footer', 'remove_add_new_post_href_in_admin_bar' );
}
}
add_action( 'init', 'remove_frontend_post_href' );
Widget-ul Quick Draft din Panoul de Control
add_action( 'wp_dashboard_setup', 'remove_draft_widget', 999 );
function remove_draft_widget(){
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
}

Aceasta este cea mai curată metodă, deși butonul New
din bara de administrare încă indică către post-new.php
- poate fi dezactivat cu puțin JavaScript, de exemplu $(document).on('click', '#wp-admin-bar-new-content', function(){ return false })

Această soluție pare să funcționeze fără probleme, dar: "Prinț privire" încă afișează postările (și nu afișează CPT-urile în niciun caz!), la fel ca secțiunea "Următorii pași" din elementul de dashboard "Bun venit în WP" [pe care îl urăsc și îl ignor oricum]. De asemenea, "Activitate" ar putea încă afișa postări, dar nu ar trebui dacă ai configurat totul corespunzător.

O alternativă, dar similară soluție cu cea a lui Stefan și Rafa. Aceasta nu aruncă erori și observați că dacă navigați direct la /wp-admin/edit.php nu veți putea vizualiza lista de articole (tipul de postare implicit), nici să le editați.
Rețineți că acest cod nu dezactivează efectiv tipul de postare implicit, adică postările existente vor rămâne publicate și accesibile prin URL-uri publice. Acesta dezactivează eficient accesul din backend la tipul de postare implicit pentru toți utilizatorii.
function remove_default_post_type($args, $postType) {
if ($postType === 'post') {
$args['public'] = false;
$args['show_ui'] = false;
$args['show_in_menu'] = false;
$args['show_in_admin_bar'] = false;
$args['show_in_nav_menus'] = false;
$args['can_export'] = false;
$args['has_archive'] = false;
$args['exclude_from_search'] = true;
$args['publicly_queryable'] = false;
$args['show_in_rest'] = false;
}
return $args;
}
add_filter('register_post_type_args', 'remove_default_post_type', 0, 2);

În principiu, este posibil să dezînregistrezi tipurile de postări deja înregistrate folosind unregister_post_type()
. Din păcate, acest lucru nu este posibil pentru tipurile de postări _builtin
.
Ca alternativă, este posibil să modifici capabilitățile necesare pentru a edita/crea/șterge/... postări pentru un anumit tip de postare. Poți folosi filtrul register_post_type_args
pentru a schimba capabilitățile necesare pentru tipul implicit de postare post
. Setând toate capabilitățile la false
, nimeni nu va avea acces la tipul implicit de postare. WordPress este destul de inteligent pentru a ascunde automat intrările din navigație.
add_filter('register_post_type_args', function($args, $postType){
if ($postType === 'post') {
$args['capabilities'] = [
'edit_post' => false,
'read_post' => false,
'delete_post' => false,
'edit_posts' => false,
'edit_others_posts' => false,
'publish_posts' => false,
'read' => false,
'delete_posts' => false,
'delete_private_posts' => false,
'delete_published_posts' => false,
'delete_others_posts' => false,
'edit_private_posts' => false,
'edit_published_posts' => false,
'create_posts' => false,
];
}
return $args;
}, 0, 2);

Mulțumesc, am introdus acest cod într-o funcție care a fost declanșată la evenimentul 'init', dar nu pare să fi avut niciun efect asupra interfeței mele de utilizator. Am folosit greșit evenimentul?

Este prea târziu. WordPress înregistrează toate tipurile de postări _builtin
la acțiunea init
, dar cu o prioritate de 0
.
Codul de mai sus înregistrează doar un filtru, nu trebuie să-l pui în interiorul unei alte acțiuni/filtre, scrie-l direct în functions.php
al temei tale, de exemplu.

+1. Problema este că aruncă 3 notificări. "Notice: Undefined offset: 0 in /var/www/html/wp-includes/capabilities.php on line 70". Nu am reușit să scap de ele.

Soluția lui Stefan este excelentă, dar dacă activezi debug-ul poți vedea: Undefined offset: 0 în wp-includes/capabilities.php pe linia 62 plus că lipsește un ; după return $args
Codul exhaustiv ar trebui să fie:
add_filter('register_post_type_args', function($args, $postType){
if ($postType === 'post' && current_user_can( 'create_posts' ) && current_user_can( 'edit_post' ) ) {
$args['capabilities'] = [
'edit_post' => false,
'read_post' => false,
'delete_post' => false,
'edit_posts' => false,
'edit_others_posts' => false,
'publish_posts' => false,
'read' => false,
'delete_posts' => false,
'delete_private_posts' => false,
'delete_published_posts' => false,
'delete_others_posts' => false,
'edit_private_posts' => false,
'edit_published_posts' => false,
'create_posts' => false,
];
}
return $args;
}, 0, 2);
