web-dev-qa-db-fra.com

Comment définir l'auteur d'un article que je viens de créer avec PHP?

J'utilise PHP pour créer dynamiquement une publication personnalisée. L'auteur doit être un auteur autre que l'utilisateur connecté. J'ai trouvé ceci https://stackoverflow.com/questions/5759359/wordpress-manually-set-the-author-of-a-post-in-php mais je me demande s'il existe un moyen de le faire après que le post est déjà inséré. Je suppose que je pourrais juste faire une requête de base de données ...

1
dwenaus

Si vous connaissez l'ID de l'auteur, vous pouvez utiliser wp_insert_post en lui spécifiant l'ID et l'ID de l'auteur.

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

L'astuce consiste à spécifier l'ID pour mettre à jour le message. Voir wp_insert_post() .

2
Álex Acuña Viera

Pour des raisons de simplicité et de pertinence entre cette question et une autre question posée sur Stack Overflow ( wordpress - définissez manuellement l’auteur d’une publication en php - As lié par OP ici sur WPSE.).

WordPress semble forcer une valeur pour le post_author lors de l'insertion ou de la mise à jour de publications à l'aide de wp_insert_post() et wp_update_post() .

Pour contourner ce problème, utilisez le crochet de filtrage 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 );

Exemple Utilisation du crochet de filtre 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 );

Cela peut être particulièrement pratique pour insérer ou mettre à jour des publications en utilisant PHP.

Remarque:Vous voudrez bien vous assurer de désactiver le support de author dans votre type de publication personnalisé et probablement être prudent lorsque vous utilisez des fonctions liées à l'auteur dans le cadre de ce type de publication.

1
Michael Ecklund

S'il s'agit d'un type d'article personnalisé et que vous ne voulez pas qu'un auteur soit affecté à un article, vous pouvez supprimer "auteur" de supports( array ) dans register_post_type. http://codex.wordpress.org/Function_Reference/register_post_type

Si vous avez toujours besoin du support de l'auteur pour votre type de publication, il serait beaucoup plus judicieux de le faire dans post.php/post-new.php en filtrant l'auteur metabox.

La solution consiste à ajouter un utilisateur nul ou null au menu déroulant à l'aide de wp_dropdown_users 'show_option_none'. WordPress utilisera <option value="-1"> pour votre utilisateur nul, mais il apparaîtra à 0 dans la base de données.

* Remarque: Cet exemple déplace également l'auteur div juste au-dessus du bouton Publier.

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

Je suis sûr que vous remarquez tous les contrôles conditionnels supplémentaires pour $ sélectionné. C’est peut-être exagéré, mais nous avons éliminé tout problème empêchant les rédacteurs en chef de ne pas permettre à un auteur d’être remplacé par aucun des articles précédents publiés.

0
Chris_O