web-dev-qa-db-fra.com

Définir les publications d’un type de publication personnalisé comme étant privées par défaut?

Supposons que j'ai créé un type de message personnalisé appelé "Messages privés" ($post_type = itsme_private_posts) et que tous les messages du type de message personnalisé soient automatiquement définis sur "Privé" lors de leur publication, c'est-à-dire par défaut. Comment fait-on ça?

Basé sur la réponse de @ brasofilo à une question connexe sur StackOverflow , j'ai essayé ceci:

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;
}

Cela ne fonctionne pas c'est-à-dire qu'il ne fait rien; tout était comme avant l'ajout de la fonction. C'est comme si la fonction n'existait pas ou ne faisait simplement rien.

Ensuite, sur la base de cet article intitulé " Forcer le type de message personnalisé à être privé ", j'ai essayé ceci:

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;
}

Cela fonctionne, en ce sens que lorsque je publie ou met à jour un message, il devient privé. Bien! Mais lorsque je crée un nouveau message ("Ajouter un nouveau") et que je pars sans rien faire, un brouillon "privé" (auto) est créé et sauvegardé. De plus, je ne peux même pas vider ce truc!

Essentiellement, je n'arrive pas à comprendre comment le faire. Alors, comment puis-je définir les messages d'un type de message personnalisé pour être privé par défaut?

5
its_me

Le problème avec le code dans votre question est que toujours intercepte. Vous perdez complètement la possibilité de ne pas publier, pas de brouillon possible. Pourquoi cela mène-t-il à un message incontrôlable est une chose que je n'ai pas inspectée davantage. En tout cas ce n'est pas ce qu'on veut.

Je suis heureux que la solution javascript fonctionne pour vous, mais personnellement, j'ai deux problèmes avec elle, premier, vous pouvez enregistrer le message en tant que public, deuxième, cela rend la tâche plus difficile - car le script définit toujours le bouton radio à privé - pour gérer le travail avec les brouillons. D'une certaine manière, il existe maintenant deux solutions à la réponse.


1. Forcer le type de message à être privé plus indication visuelle:

C’est la raison pour laquelle j’ai jeté un œil à nouveau sur la transition post-statut et, comme je l’ai dit, cela peut être fait avec Transitions post-statut .

Code:

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 );
    }
} 

Ces forces publications publiées de votre type d'article sont privées. Sans interférer avec la possibilité de sauvegarder des brouillons. Cela seul suffirait à résoudre le problème d'avoir un type de message privé.
Mais il serait bien sûr que le caractère privé du type de poste soit représenté dans le métabox d'édition. Pour cela, j'ai légèrement modifié le javascript. Principalement en ne définissant pas la case à cocher par défaut, mais en modifiant le texte affiché, j'ai ajouté une note.

Code:

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>Note:</strong> Published posts are always <strong>private</strong>.');
        $post->post_password = '';
        $visibility = 'private';
        $visibility_trans = __('Private');
    ?>
    <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
}

Source: Comment définir par défaut la visibilité des nouveaux messages??
Remarque: Par rapport au code ci-dessous, j'ai supprimé la vérification du bouton radio et ajouté du code pour le message.

Bien sûr, vous n'avez pas besoin du javascript pour rendre votre type de message privé, mais il est toujours agréable d'avoir des informations visuelles. Pour cette raison, c'est un bel ajout.


2. Rendre privé l'option standard dans la méta-boîte de publication:

Je garde cela parce que @its_me a accepté la réponse comme solution. Comme je l'ai dit dans le commentaire, j'ai trouvé un morceau de code utile. Il s'occupe de régler la visibilité de la méta-box sur privé en se connectant à post_submitbox_misc_actions . Comme je le disais au début "Cela me pose deux problèmes: premièrement, vous pouvez enregistrer la publication en public, deuxièmement, cela rend la tâche plus difficile - car le script définit toujours le bouton radio en mode privé - pour gérer les brouillons". Il est toujours possible d'avoir et de travailler avec des brouillons, mais pas aussi intuitif qu'auparavant, mais le statut de publication privée n'est en aucun cas appliqué.

Code:

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 = __('Private');
    ?>
    <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
}

Source: Comment définir par défaut la visibilité des nouveaux messages??
Remarque: J'ai raccourci le code pour l'adapter aux besoins ici.

13
Nicolai

Sur la base de la réponse ci-dessus, voici ce à quoi je suis arrivé, avec la partie 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>(when it's published, the status becomes private)</em></div>" ).insertAfter( $('#post-visibility-select') );
              $('a.edit-visibility').css({'display': 'none'});
          } catch(err){}
      }) (jQuery);
  </script>
  <?php
}

Parce que j'aime voir ce qui se passe exactement avec le statut. Le code pour add_filter( 'wp_insert_post_data' j'ai utilisé inchangé.

Merci beaucoup pour vos solutions!

0
Olga Farber

C’est la méthode la plus "standard" que j’ai trouvée jusqu’à présent pour définir la visibilité des publications sur privée par défaut:

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');

Notez que vous devez vous assurer que post_status n'est pas une "corbeille", sinon vous ne pourriez pas supprimer votre message. Nous vérifions également les statuts "brouillon" et "brouillon automatique" afin d'éviter de définir les messages comme "privés" lors de leur rédaction.

Avec cela, il n’est pas nécessaire d’ajouter du JS, la visibilité sera définie comme privée dès le début.

Si vous souhaitez cibler un type de publication spécifique, vous pouvez le faire de la manière suivante:

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');

J'ai d'abord trouvé la solution ici: http://wpsnipp.com/index.php/functions-php/force-custom-post-type-to-be-private/

0
Jonathan Pasquier