web-dev-qa-db-de.com

Wie kann ich den Autor eines Posts festlegen, den ich gerade mit PHP erstellt habe?

Ich benutze PHP, um dynamisch einen benutzerdefinierten Beitrag zu erstellen, und ich brauche einen anderen Autor als den angemeldeten Benutzer. Ich habe dies gefunden https://stackoverflow.com/questions/5759359/wordpress-manually-set-the-author-of-a-post-in-php aber ich frage mich, ob es eine Möglichkeit gibt, dies zu tun es nach dem Beitrag ist bereits eingefügt. Ich denke, ich könnte einfach eine DB-Abfrage machen ...

1
dwenaus

Wenn Sie die ID des Autors kennen, können Sie wp_insert_post verwenden, um die ID und die Autoren-ID anzugeben.

$id = $post->ID; // change this to whathever
$user_id = '4'; // change this too

$the_post = array();
$the_post['ID'] = $id;
$the_post['post_author'] = $user_id;

wp_insert_post( $the_post );

Der Trick besteht darin, die ID anzugeben, mit der der Beitrag aktualisiert werden soll. Siehe wp_insert_post() .

2

Der Einfachheit halber und der Relevanz halber zwischen dieser Frage und einer anderen Frage auf Stack Overflow ( WordPress - Manuelles Setzen des Autors eines Posts in PHP - Wie von OP hier auf WPSE verlinkt.).

WordPress scheint einen Wert für den post_author zu erzwingen, während Beiträge mit wp_insert_post() und wp_update_post() eingefügt oder aktualisiert werden.

Der Weg dahin ist, den Filterhaken zu benutzen wp_insert_post_data.

/**
 * Filter slashed post data just before it is inserted into the database.
 *
 * @since 2.7.0
 *
 * @param array $data    An array of slashed post data.
 * @param array $postarr An array of sanitized, but otherwise unmodified post data.
 */
$data = apply_filters( 'wp_insert_post_data', $data, $postarr );

Beispiel Verwendung des Filter Hooks wp_insert_post_data:

function remove_author_id( $data, $postarr ) {

    if ( $data['post_type'] != 'YOUR-POST-TYPE-HERE' ) {
        return $data;
    }

    $data['post_author'] = 0;

    return $data;

}

add_filter( 'wp_insert_post_data', 'remove_author_id', '99', 2 );

Dies kann besonders nützlich sein, um Beiträge mit PHP einzufügen oder zu aktualisieren.

Hinweis:Sie sollten sicherstellen, dass die Unterstützung für author in Ihrem benutzerdefinierten Post-Typ deaktiviert ist und Sie möglicherweise vorsichtig sind, wenn Sie autorenspezifische Funktionen im Rahmen dieses Post-Typs verwenden.

1
Michael Ecklund

Wenn dies ein benutzerdefinierter Beitragstyp ist und Sie nicht möchten, dass einem Beitrag ein Autor zugewiesen wird, können Sie "Autor" aus supports( array ) in register_post_type entfernen. http://codex.wordpress.org/Function_Reference/register_post_type

Wenn Sie weiterhin Autorenunterstützung für Ihren Beitragstyp benötigen, ist es viel sinnvoller, dies in post.php/post-new.php zu tun, indem Sie die Autoren-Metabox filtern.

Die Lösung besteht darin, der Dropdown-Liste mit wp_dropdown_users einen Benutzer mit dem Wert "none" oder "null" hinzuzufügen. 'show_option_none' WordPress verwendet <option value="-1"> für Ihren Benutzer mit dem Wert "null", der jedoch in der Datenbank als 0 angezeigt wird.

* Hinweis: In diesem Beispiel wird auch das Autorendiv direkt über die Schaltfläche zum Veröffentlichen verschoben.

add_action( 'post_submitbox_misc_actions', 'move_author_meta' );

function move_author_meta() {
    global $post_ID;
    $post = get_post( $post_ID );
    echo '<div id="author" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:0px;">Author: ';
    better_author_meta_box( $post );  //This function is being called in replace author_meta_box()

    echo '</div>';

}

function better_author_meta_box($post) { ?>

   <label class="screen-reader-text" for="post_author_override"><?php _e('Author'); ?></label>
  <?php

    if ( 'auto-draft' == $post->post_status ) : $selected = false; elseif (  $post->post_author == 0 || ( ! $post->post_author) ) : $selected = -1; else : $selected = $post->post_author; endif;
    wp_dropdown_users( array(
            'who' => 'authors',
            'name' => 'post_author_override',
            'selected' => $selected ? $selected : (int) -1,
            'include_selected' => true,
            'show_option_none' => 'NONE',
            'orderby'          => 'display_name',
            'show'             => 'display_name',
            'order'            => 'ASC'
      ) );
  }

Ich bin mir sicher, dass Sie alle zusätzlichen bedingten Prüfungen für $ selected bemerken. Es könnte übertrieben sein, beseitigt jedoch alle Probleme mit Redakteuren, die nicht in der Lage sind, einen Autor aus früheren veröffentlichten Beiträgen in keinen anderen zu ändern.

0
Chris_O