Impostare i post di un custom post type come privati di default?
Supponiamo che abbia creato un custom post type chiamato 'Private Posts' ($post_type
= itsme_private_posts
) e voglio che tutti i post sotto questo custom post type siano impostati come 'Privati' automaticamente quando vengono pubblicati, cioè di default. Come posso farlo?
Basandomi sulla risposta di @brasofilo a una domanda correlata su StackOverflow, ho provato questo:
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;
}
Non funziona, cioè non fa nulla; tutto rimane come prima dell'aggiunta della funzione. È come se la funzione non esistesse o semplicemente non facesse nulla.
Poi, basandomi su questo articolo intitolato "Forzare un custom post type a essere privato", ho provato questo:
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;
}
Funziona, nel senso che quando pubblico o aggiorno un post diventa privato. Bene! Ma quando creo un nuovo post ('Aggiungi nuovo') e lo lascio senza fare nulla, crea una bozza automatica 'privata' e la salva. Inoltre non posso nemmeno cestinare quella cosa!
In sostanza non riesco a capire come farlo. Quindi, come posso impostare i post di un custom post type come privati di default?

Il problema con il codice nella tua domanda è che sempre intercetta. Perdi completamente la possibilità di non pubblicare, nessuna bozza possibile. Perché questo porti a post non recuperabili è qualcosa che non ho approfondito. Comunque non è ciò che si vuole.
Sono contento che la soluzione JavaScript funzioni per te, ma personalmente ho due problemi con essa, primo, puoi salvare il post come pubblico, secondo, rende più difficile - perché lo script imposta sempre il pulsante radio su privato - gestire il lavoro con le bozze. In un certo senso ci sono ora due soluzioni alla risposta.
1. Forzare il tipo di post a essere privato più indicazione visiva:
Questo è il motivo per cui ho dato un'altra occhiata a farlo con le transizioni dello stato del post e, come ho detto, può essere fatto con Post Status Transitions.
Codice:
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 );
}
}
Questo forza i post pubblicati del tuo tipo di post a essere privati. Senza interferire con la possibilità di salvare bozze. Questo da solo sarebbe sufficiente per risolvere il problema di avere un tipo di post privato.
Ma naturalmente sarebbe bello avere la natura privata del tipo di post rappresentata nel metabox di pubblicazione. Per questo ho modificato un po' il javascript. Principalmente non impostando la checkbox di default, ma cambiando comunque il testo mostrato, inoltre ho aggiunto una nota.
Codice:
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>Nota:</strong> I post pubblicati sono sempre <strong>privati</strong>.');
$post->post_password = '';
$visibility = 'private';
$visibility_trans = __('Privato');
?>
<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
}
Fonte: Come impostare la visibilità dei nuovi post su privato di default?
Nota: Rispetto al codice qui sotto ho rimosso la selezione del pulsante radio e aggiunto codice per il messaggio.
Naturalmente non hai bisogno del javascript per rendere privato il tuo tipo di post, ma è sempre bello avere le cose indicate visivamente. Per questo motivo è un'aggiunta gradita.
2. Rendere privata l'opzione standard nel metabox di pubblicazione:
Mantengo questo perché @its_me ha accettato la risposta per questo come soluzione. Come ho detto nel commento ho trovato un pezzo di codice utile, si occupa di impostare la visibilità nel metabox su privato agganciandosi a post_submitbox_misc_actions
. Come ho detto all'inizio »Ho due problemi con esso, primo, puoi salvare il post come pubblico, secondo, rende più difficile - perché lo script imposta sempre il pulsante radio su privato - gestire il lavoro con le bozze«. È ancora possibile avere e lavorare con bozze, solo non così intuitivo come prima, ma lo stato di pubblicazione privato non è in alcun modo forzato.
Codice:
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 = __('Privato');
?>
<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
}
Fonte: Come impostare la visibilità dei nuovi post su privato di default?
Nota: Ho abbreviato il codice per adattarlo alle necessità qui.

Puoi per favore fornirmi un esempio su come potrei usarlo per fare quello che voglio? Non ne sono sicuro.

Ho realizzato che $new_status
è auto-draft
e $old_status
è new
- ho modificato il codice di conseguenza. @its_me Oltre a questo ho trovato un altro bel pezzo di codice, che aggiungo alla risposta.

La soluzione basata su JavaScript ha funzionato, ma non la prima. L'ho segnata come risposta perché risolve il mio problema, ma sarebbe bello se potessi scoprire cosa non va nel primo blocco di codice. Se non riesci, per favore rimuovilo (per evitare confusione per gli altri). Grazie mille per il tuo tempo!

Ho aggiornato la risposta, non sono sicuro se ricevi una notifica dopo aver accettato la risposta. @its_me

Sì, ti ho sentito e volevo farti sapere che la nuova soluzione sembra funzionare. Grazie mille per il tuo tempo!

Questo è il metodo più "standard" che ho trovato finora per impostare la visibilità dei post come privata di default:
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');
Nota che devi assicurarti che post_status non sia "trash", altrimenti non saresti in grado di eliminare il tuo post. Controlliamo anche lo stato "draft" e "auto-draft" per evitare di impostare i post come "privati" mentre li stai redigendo.
Con questo, non c'è bisogno di aggiungere del JS, la visibilità verrà impostata come privata fin dall'inizio.
Se vuoi specificare un tipo di post particolare, puoi farlo in questo modo:
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');
Ho trovato per la prima volta questa soluzione qui: http://wpsnipp.com/index.php/functions-php/force-custom-post-type-to-be-private/

È un'idea molto interessante, ma bisogna tenere presente che fa sì che i nuovi post creati perdano direttamente lo stato di "bozza" e vengano "pubblicati privatamente", invece di essere creati come "bozze" con l'opzione "privato" già selezionata. Questo, ad esempio, assegna loro direttamente uno slug (precisamente lo slug auto-draft
), il che può essere scomodo.

Hai perfettamente ragione! Poco dopo aver pubblicato questa risposta mi sono accorto del problema e ho corretto il mio codice, ma ho dimenticato di aggiornare la risposta. Ora è fatto! Grazie!

Sulla base della risposta precedente, ecco a cosa sono arrivato, con la parte 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>(quando viene pubblicato, lo stato diventa privato)</em></div>" ).insertAfter( $('#post-visibility-select') );
$('a.edit-visibility').css({'display': 'none'});
} catch(err){}
}) (jQuery);
</script>
<?php
}
Perché mi piace vedere esattamente cosa succede con lo stato. Il codice per add_filter( 'wp_insert_post_data'
l'ho usato invariato.
Grazie mille per le tue soluzioni!
