it-swarm.com.de

Beiträge eines eigenen Beitragstyps standardmäßig als privat festlegen?

Angenommen, ich habe einen benutzerdefinierten Beitragstyp mit dem Namen "Private Beiträge" ($post_type = itsme_private_posts) erstellt und möchte, dass alle Beiträge unter dem benutzerdefinierten Beitragstyp automatisch auf "Privat" gesetzt werden, wenn sie veröffentlicht werden, d. H. Standardmäßig. Wie mache ich es?

Basierend auf der Antwort von @ brasofilo auf eine verwandte Frage zu StackOverflow habe ich Folgendes versucht:

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

Es funktioniert nicht, d. H. Es macht nichts. Alles ist so, wie es war, bevor die Funktion hinzugefügt wurde. Es ist, als ob die Funktion nicht existiert oder einfach nichts tut.

Basierend auf diesem Artikel mit dem Titel " Benutzerdefinierten Beitragstyp als privat erzwingen " habe ich Folgendes versucht:

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

Wenn ich einen Beitrag veröffentliche oder aktualisiere, wird er privat. Gut! Wenn ich aber einen neuen Beitrag erstelle ('Add New') und nichts mache, wird ein 'privater' (automatischer) Entwurf erstellt und gespeichert. Außerdem kann ich das Ding nicht mal wegschmeißen!

Im Grunde kann ich nicht herausfinden, wie es geht. Wie kann ich also festlegen, dass Posts eines benutzerdefinierten Post-Typs standardmäßig privat sind?

5
its_me

Das Problem mit dem Code in Ihrer Frage ist, dass immer abfängt. Sie verlieren völlig die Möglichkeit, keine Entwürfe mehr zu veröffentlichen. Warum dies dazu führt, dass die Post nicht mehr verwüstet werden kann, habe ich nicht weiter untersucht. Jedenfalls ist das nicht das, was man will.

Ich bin froh, dass die Javascript-Lösung für Sie funktioniert, aber ich persönlich habe zwei Probleme damit, erstes, Sie können den Beitrag als öffentlich speichern, zweites, Dies erschwert die Arbeit mit Entwürfen, da das Skript das Optionsfeld immer auf privat setzt. In gewisser Weise gibt es jetzt zwei Lösungen für die Antwort.


1. Erzwingen, dass der Beitragstyp privat ist, plus visuelle Anzeige:

Aus diesem Grund habe ich es mir noch einmal mit Übergängen nach dem Status angesehen und wie gesagt, kann es mit Übergänge nach dem Status durchgeführt werden.

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

Diese erzwingt veröffentlichten Beiträge Ihres Beitragstyps sind privat. Ohne die Fähigkeit zu beeinträchtigen, Entwürfe zu speichern. Dies allein würde ausreichen, um das Problem eines privaten Beitragstyps zu lösen.
Aber natürlich wäre es schön, wenn der private Charakter des Post-Typs in der Publishing-Metabox dargestellt würde. Hierzu habe ich das Javascript etwas angepasst. Hauptsächlich, indem ich das Kontrollkästchen nicht standardmäßig aktiviert habe, aber trotzdem den angezeigten Text ändere, habe ich zusätzlich eine Notiz hinzugefügt.

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: Wie wird die Sichtbarkeit neuer Beiträge standardmäßig auf privat gesetzt?
Hinweis: Verglichen mit dem folgenden Code habe ich das Aktivieren des Optionsfelds entfernt und zusätzlich den Code für die Nachricht hinzugefügt.

Natürlich brauchen Sie kein Javascript, um Ihren Beitragstyp privat zu machen, aber es ist immer schön, wenn Dinge visuell angezeigt werden. Aus diesem Grund ist es eine schöne Ergänzung.


2. Private als Standardoption in der Meta-Box für Veröffentlichungen festlegen:

Ich behalte das, weil @its_me die Antwort als Lösung akzeptiert hat. Wie ich in dem Kommentar sagte, habe ich einen hilfreichen Code gefunden, der dafür sorgt, dass die Sichtbarkeit in der Meta-Box durch Einhaken von post_submitbox_misc_actions auf privat gesetzt wird. Wie ich zu Beginn sagte: "Ich habe zwei Probleme damit: Erstens können Sie Posts als öffentlich speichern, zweitens wird es schwieriger, mit Entwürfen zu arbeiten, da das Skript das Optionsfeld immer auf privat setzt." Entwürfe können weiterhin verwendet und bearbeitet werden. Dies ist zwar nicht so intuitiv wie zuvor, der Status des privaten Publizierens wird jedoch in keiner Weise durchgesetzt.

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: Wie wird die Sichtbarkeit neuer Beiträge standardmäßig auf privat gesetzt?
Hinweis: Ich habe den Code gekürzt, um den Anforderungen hier zu entsprechen.

13
Nicolai

Auf der Grundlage der obigen Antwort kam ich mit dem Client-Teil (Javascript) zu folgendem Ergebnis:

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
}

Weil ich es liebe zu sehen, was genau mit dem Status los ist. Der Code für add_filter( 'wp_insert_post_data' habe ich unverändert verwendet.

Vielen Dank für Ihre Lösungen!

0
Olga Farber

Dies ist der "Standard", den ich bisher gefunden habe, um die Sichtbarkeit von Posts standardmäßig auf privat zu setzen:

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

Beachten Sie, dass Sie sicherstellen müssen, dass post_status nicht "Papierkorb" ist, da Sie sonst Ihren Beitrag nicht löschen können. Wir überprüfen auch den Status "Entwurf" und "Auto-Entwurf", um zu vermeiden, dass Beiträge beim Redigieren als "privat" eingestuft werden.

Damit müssen Sie kein JS hinzufügen. Die Sichtbarkeit wird von Anfang an auf privat gesetzt.

Wenn Sie auf einen bestimmten Beitragstyp abzielen möchten, können Sie dies folgendermaßen tun:

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

Ich habe die Lösung zuerst hier gefunden: http://wpsnipp.com/index.php/functions-php/force-custom-post-type-to-be-private/

0