Impostare i post di un custom post type come privati di default?

15 ott 2013, 20:44:11
Visualizzazioni: 15.9K
Voti: 7

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?

2
Commenti

Inoltre non riesco nemmeno a cestinare quella cosa! Il motivo per cui non potevi cestinare i post era perché stavi sempre impostando il post_status su private. Quando si cestinano i post, lo stato del post viene impostato su trash, ma tu stavi sovrascrivendo questo comportamento. Ho scoperto che un approccio migliore è impostare lo stato del post su private solo se lo stato attuale è public.

c.hill c.hill
28 mar 2015 13:23:15

Revisionato: Dovrebbe impostare lo stato del post su private se attualmente è publish. public non è uno stato valido per i post.

c.hill c.hill
28 mar 2015 13:31:21
Tutte le risposte alla domanda 3
7
15

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.

15 ott 2013 21:26:18
Commenti

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

its_me its_me
15 ott 2013 21:45:08

Ora mi hai incuriosito :) lo sto testando da solo. @its_me

Nicolai Grossherr Nicolai Grossherr
15 ott 2013 22:23:09

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.

Nicolai Grossherr Nicolai Grossherr
15 ott 2013 22:56:43

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!

its_me its_me
16 ott 2013 06:48:14

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

Nicolai Grossherr Nicolai Grossherr
17 ott 2013 00:38:24

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

its_me its_me
17 ott 2013 00:42:06

Piacere, mi hai incuriosito, tutto qui :D @its_me

Nicolai Grossherr Nicolai Grossherr
17 ott 2013 00:47:29
Mostra i restanti 2 commenti
3

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/

31 ago 2017 17:27:37
Commenti

È 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.

cgogolin cgogolin
21 ago 2018 12:37:26

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!

Jonathan Pasquier Jonathan Pasquier
21 ago 2018 14:13:03

Ha funzionato per me. Grazie

TomC TomC
27 nov 2019 12:59:02
0

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!

11 set 2016 21:52:10