Setează postările unui tip de postare personalizată să fie private implicit?
Să spunem că am creat un tip de postare personalizată numit 'Postări Private' ($post_type
= itsme_private_posts
) și vreau ca toate postările din acest tip să fie setate automat ca 'Private' la publicare, adică implicit. Cum pot face asta?
Bazându-mă pe răspunsul lui @brasofilo la o întrebare similară pe StackOverflow, am încercat asta:
add_filter( 'wp_insert_post_data', 'itsme_cpt_private', '99', 2 );
function itsme_cpt_private( $data , $postarr ) {
if( $postarr['post_type'] == 'itsme_private_posts' ) {
$data['post_status'] = 'private';
}
return $data;
}
Nu funcționează, adică nu face nimic; totul rămâne la fel ca înainte de a adăuga funcția. Este ca și cum funcția nu există sau pur și simplu nu face nimic.
Apoi, bazându-mă pe acest articol intitulat "Forțează un tip de postare personalizată să fie privat", am încercat asta:
add_filter( 'wp_insert_post_data', 'itsme_cpt_private' );
function itsme_cpt_private( $post ) {
if( $post['post_type'] == 'itsme_private_posts' ) {
$post['post_status'] = 'private';
}
return $post;
}
Funcționează, în sensul că, atunci când public sau actualizez o postare, aceasta devine privată. Bine! Dar când creez o postare nouă ('Adaugă nou') și plec fără să fac nimic, se creează o schiță automată 'privată' și o salvează. Mai mult, nici măcar nu pot șterge acea chestie!
În esență, nu reușesc să-mi dau seama cum să fac asta. Deci, cum pot seta postările unui tip de postare personalizată să fie private implicit?

Problema cu codul din întrebarea ta este că întotdeauna interceptează. Pierzi complet abilitatea de a nu publica, niciun draft nu este posibil. De ce aceasta duce la postări care nu pot fi restaurate din coșul de gunoi este ceva ce nu am investigat mai departe. Oricum, acesta nu este ceea ce dorim.
Mă bucur că soluția cu JavaScript funcționează pentru tine, dar personal am două probleme cu ea, în primul rând, poți salva postarea ca publică, în al doilea rând, face mai dificilă - deoarece scriptul setează întotdeauna butonul radio la privat - gestionarea lucrului cu drafturile. Într-un fel, există acum două soluții pentru răspuns.
1. Forțarea tipului de postare să fie privată plus indicare vizuală:
De aceea am mai cercetat o dată realizarea acestui lucru cu tranziții de stare a postării și, așa cum am spus, se poate face cu Tranziții de Stare a Postării.
Cod:
add_action( 'transition_post_status', 'wpse118970_post_status_new', 10, 3 );
function wpse118970_post_status_new( $new_status, $old_status, $post ) {
if ( $post->post_type == 'itsme_private_posts' && $new_status == 'publish' && $old_status != $new_status ) {
$post->post_status = 'private';
wp_update_post( $post );
}
}
Aceasta forțează postările publicate de tipul tău de postare să fie private. Fără a interfera cu abilitatea de a salva drafturi. Acest lucru de sine stătător ar fi suficient pentru a rezolva problema de a avea un tip de postare privat.
Dar, desigur, ar fi frumos să reprezintem natura privată a tipului de postare în metabox-ul de publicare. Pentru asta am ajustat puțin JavaScript-ul. În principal prin a nu seta checkbox-ul implicit, dar totuși schimbând textul afișat, în plus am adăugat o notă.
Cod:
add_action( 'post_submitbox_misc_actions' , 'wpse118970_change_visibility_metabox' );
function wpse118970_change_visibility_metabox(){
global $post;
if ($post->post_type != 'post')
return;
$message = __('<strong>Notă:</strong> Postările publicate sunt întotdeauna <strong>private</strong>.');
$post->post_password = '';
$visibility = 'private';
$visibility_trans = __('Privat');
?>
<style type="text/css">
.priv_pt_note {
background-color: lightgreen;
border: 1px solid green;
border-radius: 2px;
margin: 4px;
padding: 4px;
}
</style>
<script type="text/javascript">
(function($){
try {
$('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
$('#hidden-post-visibility').val('<?php echo $visibility; ?>');
} catch(err){}
}) (jQuery);
</script>
<div class="priv_pt_note">
<?php echo $message; ?>
</div>
<?php
}
Sursă: Cum să setezi vizibilitatea postărilor noi ca privată implicit?
Notă: Comparativ cu codul de mai jos, am eliminat bifarea butonului radio și am adăugat cod pentru mesaj.
Desigur, nu ai nevoie de JavaScript pentru a face tipul tău de postare privat, dar este întotdeauna frumos să ai lucrurile indicate vizual. Din acest motiv, este o adăugare plăcută.
2. Setarea opțiunii private ca standard în metabox-ul de publicare:
Păstrez aceasta deoarece @its_me a acceptat acest răspuns ca soluție. Așa cum am spus în comentariu, am găsit o bucată de cod utilă, care se ocupă de setarea vizibilității în metabox la privat prin conectarea la post_submitbox_misc_actions
. Așa cum am spus la început »Am două probleme cu ea, în primul rând, poți salva postarea ca publică, în al doilea rând, face mai dificil - deoarece scriptul setează întotdeauna butonul radio la privat - gestionarea lucrului cu drafturile«. Este încă posibil să ai și să lucrezi cu drafturi, doar nu la fel de intuitiv ca înainte, dar statutul de publicare privat nu este în niciun fel impus.
Cod:
add_action( 'post_submitbox_misc_actions' , 'wpse118970_change_visibility_metabox_value' );
function wpse118970_change_visibility_metabox_value(){
global $post;
if ($post->post_type != 'itsme_private_posts')
return;
$post->post_password = '';
$visibility = 'private';
$visibility_trans = __('Privat');
?>
<script type="text/javascript">
(function($){
try {
$('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
$('#hidden-post-visibility').val('<?php echo $visibility; ?>');
$('#visibility-radio-<?php echo $visibility; ?>').attr('checked', true);
} catch(err){}
}) (jQuery);
</script>
<?php
}
Sursă: Cum să setezi vizibilitatea postărilor noi ca privată implicit?
Notă: Am scurtat codul pentru a se potrivi nevoilor de aici.

Poți să-mi dai un exemplu despre cum aș putea folosi asta pentru a face ceea ce vreau? Nu sunt sigur despre asta.

Am realizat că $new_status
este auto-draft
iar $old_status
este new
- am modificat codul în consecință. @its_me Pe lângă asta, am găsit o altă bucată de cod interesantă, pe care o adaug la răspuns.

Soluția bazată pe JavaScript a funcționat, dar nu și prima. Am marcat ca răspuns pentru că rezolvă problema mea, dar ar fi frumos dacă ai putea afla ce nu merge în primul bloc de cod. Dacă nu poți, te rog să-l elimini (pentru a evita confuzia pentru alții). Mulțumesc mult pentru timpul acordat!

Am actualizat răspunsul, nu sunt sigur dacă primești notificare după ce ai acceptat răspunsul. @its_me

Da, te-am auzit și am vrut să-ți spun că noua soluție pare să funcționeze. Mulțumesc foarte mult pentru timpul acordat!

Acesta este cel mai "standard" mod pe care l-am găsit până acum pentru a seta implicit vizibilitatea articolelor ca private:
function wp_118970_force_type_private($post) {
if ($post['post_status'] != 'trash' && $post['post_status'] != "draft" && $post['post_status'] != "auto-draft") {
$post['post_status'] = 'private';
}
return $post;
}
add_filter('wp_insert_post_data', 'wp_118970_force_type_private');
Notă: Trebuie să vă asigurați că post_status nu este "trash", altfel nu veți putea șterge articolul. De asemenea, verificăm stările "draft" și "auto-draft" pentru a evita setarea articolelor ca "private" în timpul redactării lor.
Cu acest cod, nu este nevoie să adăugați JavaScript, vizibilitatea va fi setată ca private de la început.
Dacă doriți să țintiți un anumit tip de articol, puteți face asta în felul următor:
function wp_118970_force_type_private($post) {
if ($post['post_status'] != 'trash' && $post['post_status'] != "draft" && $post['post_status'] != "auto-draft" && $post['post_type'] == 'my_post_type') {
$post['post_status'] = 'private';
}
return $post;
}
add_filter('wp_insert_post_data', 'wp_118970_force_type_private');
Am găsit prima dată soluția aici: http://wpsnipp.com/index.php/functions-php/force-custom-post-type-to-be-private/

Aceasta este o idee foarte bună, dar trebuie să fim conștienți că face ca noile articole create să-și piardă direct statutul de "schiță" și să devină "publicate privat", în loc să rămână "schițe" cu opțiunea "privat" preselectată. Acest lucru, de exemplu, le atribuie direct un slug (și anume slug-ul auto-draft
), ceea ce poate fi incomod.

Aveți totală dreptate! La ceva timp după ce am postat acest răspuns am observat problema și am corectat codul meu, dar am uitat să actualizez răspunsul. Acum este făcut! Mulțumesc!

Pe baza răspunsului de mai sus, iată la ce am ajuns, cu partea de client (javascript):
add_action( 'post_submitbox_misc_actions' , 'ourcpt_change_visibility_metabox' );
function ourcpt_change_visibility_metabox() {
global $post;
if ( 'ourcpt' != $post->post_type ) { return; }
//else
$post->post_password = '';
?>
<script type="text/javascript">
(function($){
try {
$( "<div class='misc-pub-section'><em>(când este publicat, statusul devine privat)</em></div>" ).insertAfter( $('#post-visibility-select') );
$('a.edit-visibility').css({'display': 'none'});
} catch(err){}
}) (jQuery);
</script>
<?php
}
Pentru că îmi place să văd exact ce se întâmplă cu statusul. Codul pentru add_filter( 'wp_insert_post_data'
l-am folosit neschimbat.
Vă mulțumesc foarte mult pentru soluțiile oferite!
