Distributor: Distribuer les messages avec le bon auteur

Créé le 23 févr. 2018  ·  9Commentaires  ·  Source: 10up/distributor

Nous avons un assez grand réseau de sites. Tous doivent afficher des informations appropriées sur l'auteur. Je vois qu'à partir de maintenant, le distributeur définira l'auteur des messages distribués sur l'ID des utilisateurs authentifiés. J'aimerais changer cela (et je suis prêt à faire le travail moi-même). Voici deux solutions possibles :

  1. La méthode la plus simple consiste simplement à passer par l'ID utilisateur de l'auteur du message d'origine et à laisser aux administrateurs le soin de s'assurer que leurs ID utilisateur sont synchronisés sur tous les sites. Cela devient un peu plus facile si vous utilisez un plugin SSO quelconque.
  2. Ajoutez un crochet à la création de la publication (ou utilisez le dt_item_mapping existant pour le pull ou dt_push_post_args pour le filtre push) pour permettre de transmettre l'ID d'auteur "correct" en fonction de l'ID de l'auteur de la publication existante et du site nous publions. Cela nécessiterait que les utilisateurs finaux disposent d'une carte ou d'une base de données de l'ID d'auteur du site actuel vers l'ID d'auteur du site externe. Ce n'est pas la chose la plus difficile au monde à construire pour beaucoup d'administrateurs, mais c'est quand même une barre assez haute. Si les gens pensent que c'est la meilleure route, j'écrirais très probablement ma propre solution et la documenterais dans README.md . À terme, une interface utilisateur pourrait éventuellement être créée dans Distributor pour gérer cela.

Quoi qu'il en soit, je recherche des commentaires sur le chemin à suivre ou sur un chemin complètement différent. Je cherche à le faire dès que possible et je soumettrais bien sûr toute modification au plugin.

Enterprise support enhancement

Tous les 9 commentaires

Nous avons écrit notre propre application de syndication et utilisé l'adresse e-mail de l'auteur pour interroger le site de réception pour l'ID. Cela suppose que les auteurs utilisent la même adresse e-mail sur tous les sites du réseau.

Merci pour l'astuce @dleeward , je viens de finir de pirater du code qui peut vivre dans votre thème functions.php pour synchroniser les auteurs lors d'un push. Il tentera de trouver l'auteur par l'adresse e-mail transmise. Si un utilisateur existant est introuvable, un utilisateur est créé avec les propriétés du WP poussant. Cela n'a pas encore été bien testé et ne devrait pas encore être utilisé en production.

if ( defined( 'DT_VERSION' ) ) {
  function setup_distributor_replacements() {
    $post_types = get_post_types(array('show_in_rest' => true));
    foreach ( $post_types as $post_type ) {
      add_action( "rest_insert_{$post_type}", 'process_original_author', 10, 3 );
    }
  }

  function process_original_author( $post, $request, $update ) {
    if ( empty( $post ) || is_wp_error( $post ) ) {
      return;
    }
    if ( ! empty( $request['distributor_original_author'] ) ) {
      $author_obj = $request['distributor_original_author'];
      $new_author = get_user_by( 'email', $author_obj['email'] );
      $author_id = 0;
      if ( ! empty( $new_author ) && ! is_wp_error( $new_author ) ) {
        $author_id = $new_author->ID;
      } else {
        $create_user = wp_insert_user(array(
          'display_name'      => $author_obj['display_name'],
          'first_name'        => $author_obj['first_name'],
          'last_name'         => $author_obj['last_name'],
          'nickname'          => $author_obj['nickname'],
          'user_displayname'  => $author_obj['user_displayname'],
          'user_email'        => $author_obj['user_email'],
          'user_login'        => $author_obj['user_login'],
          'user_nicename'     => $author_obj['user_nicename'],
          'user_pass'         => NULL
        ));
        if ( is_wp_error( $create_user ) ) {
          error_log("Error creating user during Distributor push ".$create_user->get_error_message());
          return;
        }
        $author_id = $create_user;
      }
      wp_update_post( array( 'ID' => $post->ID, 'post_author' => $author_id ) );
    }
  }

  add_action('init', 'setup_distributor_replacements');

  function add_original_author($post_body, $post, $that) {
    $post_author = get_user_by( 'id', $post->post_author );
    $author_obj = array(
      'display_name'  => $post_author->display_name,
      'first_name'    => get_user_meta($post->post_author, 'first_name', true),
      'first_name'    => get_user_meta($post->post_author, 'first_name', true),
      'last_name'     => get_user_meta($post->post_author, 'last_name', true),
      'user_email'    => $post_author->user_email,
      'user_login'    => $post_author->user_login,
      'user_nicename' => $post_author->user_nicename,
    );
    $post_body['distributor_original_author'] = $author_obj;
    return $post_body;
  }

  add_filter('dt_push_post_args', 'add_original_author', 1, 3);

}

@ robbiet480 Vous ne devez pas supposer que les user_login et user_nicename de l'auteur d'origine ne sont pas déjà utilisés. Nous créons un nom d'utilisateur arbitraire de l'heure unix actuelle préfixée par une courte chaîne de texte telle que ABC1519562843. Cela suppose que vous ne créez pas plus d'un utilisateur par seconde. Vous pouvez utiliser microtime ou ajouter un suffixe aléatoire à la place.

Nous avions beaucoup discuté de celui-ci.

En règle générale, nous pensons que la publication en tant qu'utilisateur authentifié est la solution la plus sûre et la plus compatible pour tout le monde. Nous voyons certainement que différents éditeurs peuvent avoir des exigences différentes. La création d'un nouvel utilisateur sur le site distant ouvre une tonne de questions difficiles. Quel est le rôle des nouveaux utilisateurs ? Ce compte devrait-il être accessible par l'auteur original ?

Bien sûr, cela est ouvert à la discussion, et nous aimerions entendre d'autres opinions, mais pour l'instant, le mieux que nous puissions faire est d'ajouter des crochets/filtres supplémentaires pour faciliter ce que @robbiet480 a accompli.

Une chose à noter, c'est que de nombreuses publications ont besoin de prendre en charge plusieurs auteurs pour le contenu, et dans ces cas, les "utilisateurs" ne sont souvent même pas utilisés pour la relation auteur <-> contenu.

Lorsque je travaillais sur la syndication de contenu chez DFM, nous avons utilisé Co-Authors Plus qui était une solution hybride post-type/taxonomie pour ajouter de nombreux auteurs aux publications, donc dans notre cas, nous _voulions_ que l'utilisateur authentifié soit connecté à la publication en tant que l'auteur du contenu syndiqué, nous avons donc eu une trace de l'utilisateur qui a déclenché la syndication, et nous avons syndiqué des données supplémentaires pour gérer la relation auteurs<->contenu (un peu similaire à la façon dont les relations avec les médias sont gérées)

Appréciez les commentaires, Jason !

J'ai donc franchi une étape supplémentaire maintenant et j'ai en fait ajouté la prise en charge de Co-Authors Plus au distributeur via des crochets. Voici mon code pour toute autre personne intéressée par l'intégration. J'ai posé des questions au #131 sur l'inclusion dans Distributor.

<?php

function handle_dt_process_distributor_attributes( $post, $request, $update ) {
  if ( empty( $post ) || is_wp_error( $post ) ) {
    return;
  }

  if ( is_plugin_active( 'co-authors-plus/co-authors-plus.php' ) && ! empty( $request['distributor_coauthors'] ) ) {
    global $coauthors_plus;

    $author_logins = array();

    foreach ( $request['distributor_coauthors'] as $coauthor ) {

      $existing_guest_author = $coauthors_plus->guest_authors->get_guest_author_by( 'user_login', $coauthor['user_login'] );

      if ( ! $existing_guest_author ) {
        $guest_author_id = $coauthors_plus->guest_authors->create( array(
          'display_name' => $coauthor['display_name'],
          'first_name' => $coauthor['first_name'],
          'last_name' => $coauthor['last_name'],
          'user_login' => $coauthor['user_login'],
          'user_nicename' => $coauthor['user_nicename']
        ) );

        if ( is_wp_error( $guest_author_id ) ) {
          error_log("Error creating co-author during Distributor push ".$guest_author_id->get_error_message());
          return;
        }

        if ( !$guest_author_id ) {
          error_log( '-- Failed to create guest author.' );
        }

        if ( ! empty($coauthor['avatar_url']) ) {
          require_once(ABSPATH . 'wp-admin/includes/media.php');
          require_once(ABSPATH . 'wp-admin/includes/file.php');
          require_once(ABSPATH . 'wp-admin/includes/image.php');

          $thumbnail_id = media_sideload_image($coauthor['avatar_url'], $guest_author_id, null, 'id');
          set_post_thumbnail($guest_author_id, $thumbnail_id);
        }

        $guest_author = $coauthors_plus->guest_authors->get_guest_author_by( 'ID', $guest_author_id );
        array_push($author_logins, $guest_author->user_login);
      } else {
        array_push($author_logins, $existing_guest_author->user_login);
      }
    }
    clean_post_cache($post->ID);
    $coauthors_plus->guest_authors->delete_guest_author_cache($author_logins[0]);
  }
}

add_action( 'dt_process_distributor_attributes', 'handle_dt_process_distributor_attributes', 10, 3 );

if ( is_plugin_active( 'co-authors-plus/co-authors-plus.php' ) ) {
  function distributor_coauthors_get_avatar_url( $coauthor ) {
    global $coauthors_plus;
    if ( ! is_object( $coauthor ) ) {
      return '';
    }

    if ( isset( $coauthor->type ) && 'guest-author' == $coauthor->type ) {
      if ( ! has_post_thumbnail( $coauthor->ID ) ) {
        return '';
      }

      $large_image_url = wp_get_attachment_image_src( get_post_thumbnail_id( $coauthor->ID ), 'large' );

      return $large_image_url[0];
    }

    // Make sure we're dealing with an object for which we can retrieve an email
    if ( isset( $coauthor->user_email ) ) {
      return get_avatar( $coauthor->user_email, $size, $default, $alt );
    }

    // Nothing matched, an invalid object was passed.
    return '';
  }
}

function add_dt_push_post_args($post_body, $post, $that) {
  if ( is_plugin_active( 'co-authors-plus/co-authors-plus.php' ) ) {
    $post_body['distributor_coauthors'] = array();

    foreach ( $coauthors as $coauthor ) {
      if( array_key_exists("data", $coauthor) ) {
        // Don't include real WP_Users
        continue;
      }
      $coauthor_arr = (array) $coauthor;
      $coauthor_arr['avatar_url'] = distributor_coauthors_get_avatar_url($coauthor);
      array_push($post_body['distributor_coauthors'], $coauthor_arr);
    }
  }

  return $post_body;
}

add_filter('dt_push_post_args', 'add_dt_push_post_args', 1, 3);

add_filter('dt_push_post_timeout', function($default_timeout, $post) {
  return 30;
}, 1, 2);

Re : la question initiale sur la distribution avec les auteurs, je dirais que CAP pourrait être une bonne solution provisoire pour permettre au distributeur de s'assurer que le bon auteur est crédité sans avoir à se soucier des choses que @ tlovett1 a mentionnées comme quel rôle devrait nouveau les utilisateurs ont et autres. De plus, je pense qu'il serait très logique d'ajouter plus de balises de modèle pour exposer des informations telles que l'auteur original à l'interface, tout comme nous sommes maintenant en mesure d'exposer le nom du site d'origine.

Je voudrais bloquer ce problème par la décision à prendre au #131. Si cette décision s'avère être que le distributeur prendra en charge les plugins externes plus que via des crochets/filtres, nous pouvons continuer à enquêter sur ce problème spécifique avec Co-Authors Plus et comment il peut être mieux inclus avec/aux côtés du distributeur. Si le distributeur adopte l'approche crochets/filtres uniquement, nous fermerons probablement ce problème (et, espérons-le, établirons un lien vers un exemple de référentiel pour le code d'extension Co-Authors Plus).

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

jeffpaul picture jeffpaul  ·  4Commentaires

superbuggy picture superbuggy  ·  7Commentaires

mikelking picture mikelking  ·  5Commentaires

jeffpaul picture jeffpaul  ·  5Commentaires

avag-novembit picture avag-novembit  ·  3Commentaires