Distributor: 正しい著者による投稿の配布

作成日 2018年02月23日  ·  9コメント  ·  ソース: 10up/distributor

私たちはかなり大きなサイトのネットワークを持っています。 それらのすべては、適切な著者情報を示す必要があります。 現在、ディストリビューターは分散投稿の作成者を認証済みユーザーIDに設定しているようです。 私はこれを変更したいと思います(そして自分で仕事をしたいと思っています)。 考えられる解決策は次の2つです。

  1. 最も簡単な方法は、元の投稿者のユーザーIDを渡し、管理者に任せて、ユーザーIDがすべてのサイト間で同期されていることを確認することです。 ある種のSSOプラグインを使用している場合、これは少し簡単になります。
  2. 投稿の作成にフックを追加して(またはプルに既存のdt_item_mappingを使用するか、プッシュフィルターにdt_push_post_argsを使用して)、既存の投稿者IDとどのサイトに基づいて「正しい」作成者IDを渡すことができるようにします投稿しています。 これには、エンドユーザーが現在のサイト作成者IDから外部サイト作成者IDへのマップまたはデータベースを持っている必要があります。 多くの管理者が構築するのは世界で最も難しいことではありませんが、それでもかなり高い基準です。 これが最善のルートだと人々が考えるなら、私はおそらく自分自身の解決策を書き、それをREADME.mdで文書化するでしょう。 最終的には、これを管理するためにディストリビューターでUIを作成できる可能性があります。

とにかく、どのパスをたどるか、またはまったく別のパスについてのフィードバックを探します。 私はこれをできるだけ早く終わらせることを目指しており、もちろんプラグインへの変更を送信します。

Enterprise support enhancement

全てのコメント9件

独自のシンジケーションアプリケーションを作成し、作成者の電子メールアドレスを使用して受信サイトにIDを照会しました。 これは、作成者がネットワーク内のすべてのサイトで同じ電子メールアドレスを使用していることを前提としています。

@dleewardのヒントをありがとう、私はちょうどあなたのテーマfunctions.phpに住むことができるいくつかのコードを一緒にハックして、プッシュ中に作者を同期することを終えました。 渡されたメールアドレスで作者を見つけようとします。 既存のユーザーが見つからない場合は、プッシュWPのプロパティを使用してユーザーが作成されます。 これはまだ十分にテストされていないため、本番環境ではまだ使用しないでください。

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元の作成者のuser_loginとuser_nicenameがまだ使用されていないと想定しないでください。 ABC1519562843などの短いテキスト文字列をプレフィックスとして付けた現在のUNIX時間の任意のユーザー名を作成します。 これは、1秒間に複数のユーザーを作成していないことを前提としています。 microtimeを使用するか、代わりにランダムなサフィックスを追加することができます。

これについてはよく話し合いました。

一般的に、認証されたユーザーとして投稿することは、誰にとっても最も安全で互換性のあるソリューションであると信じています。 出版社が異なれば、要件も異なる可能性があります。 リモートサイトで新しいユーザーを作成すると、多くの難しい質問が発生します。 新規ユーザーの役割は何ですか? そのアカウントは、元の作成者がアクセスできる必要がありますか?

もちろん、これは議論の余地があり、他の意見を聞きたいと思いますが、今のところ私たちができる最善のことは、 @ robbiet480が達成したことをより簡単にするためにフック/フィルターを追加することです。

注意すべき点の1つは、多くの出版物がコンテンツに対して複数の著者をサポートする必要があることです。そのような場合、「ユーザー」は著者<->コンテンツの関係にさえ使用されないことがよくあります。

私がDFMでコンテンツのシンジケートに取り組んでいたとき、投稿に多くの作成者を追加するためのハイブリッド投稿タイプ/分類ソリューションであるCo-Authors Plusを使用しました。そのため、この場合、認証されたユーザーが投稿に接続することを実際に_望んでいました_シンジケートされたコンテンツの作成者であるため、どのユーザーがシンジケーションをトリガーしたかを追跡し、作成者のコンテンツの関係を処理するために追加のデータをシンジケートしました(メディアとの関係の処理方法と多少似ています)。

フィードバックに感謝します、ジェイソン!

だから私はこれをさらに一歩進めて、実際にフックを介してディストリビューターに共著者プラスのサポートを追加しました。 これが統合に興味のある人のための私のコードです。 ディストリビューターに含めることについて#131で問い合わせました。

<?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:作者との配布に関する元のクエリでは、CAPは、 @ tlovett1がどの役割を新しくすべきかなどについて言及することを心配することなく、ディストリビューターが適切な作者を確実にクレジットできるようにするための優れたストップギャップソリューションになる可能性があると思いますユーザーが持っているなど。 さらに、元のサイト名を公開できるようになったのと同じように、元の作成者などの情報をフロントエンドに公開するために、テンプレートタグを追加することは非常に理にかなっていると思います。

#131での決定により、この問題をブロックしたいと思います。 Distributorがフック/フィルターを介するよりも外部プラグインをサポートすることが判明した場合は、Co-Authors Plusを使用してこの特定の問題を調査し、Distributorに/一緒に適切に含める方法を引き続き調査できます。 Distributorがフック/フィルターのみのアプローチを採用している場合は、この問題を解決する可能性があります(Co-Authors Plus拡張コードのサンプルリポジトリにリンクすることをお勧めします)。

このページは役に立ちましたか?
0 / 5 - 0 評価