Distributor: توزيع المشاركات مع المؤلف الصحيح

تم إنشاؤها على ٢٣ فبراير ٢٠١٨  ·  9تعليقات  ·  مصدر: 10up/distributor

لدينا شبكة كبيرة جدًا من المواقع. كل منهم بحاجة لإظهار معلومات المؤلف المناسبة. أرى أنه اعتبارًا من الآن سيقوم الموزع بتعيين مؤلف المنشورات الموزعة على معرف المستخدمين المصادق عليهم. أرغب في تغيير هذا (وأنا على استعداد للقيام بالعمل بنفسي). إليك حلين محتملين:

  1. أبسط طريقة هي تمرير معرف المستخدم لمؤلف المنشور الأصلي وترك الأمر للمسؤولين للتأكد من مزامنة معرفات المستخدم الخاصة بهم عبر جميع المواقع. يصبح هذا أسهل قليلاً إذا كنت تستخدم مكونًا إضافيًا من نوع SSO.
  2. أضف رابطًا لإنشاء المنشور (أو استخدم dt_item_mapping الحالي للسحب أو dt_push_post_args لتصفية الدفع) للسماح بتمرير معرّف المؤلف "الصحيح" بناءً على معرّف مؤلف المنشور الحالي والموقع نقوم بالنشر على. قد يتطلب ذلك أن يكون لدى المستخدمين النهائيين خريطة أو قاعدة بيانات لمعرف مؤلف الموقع الحالي لمعرف كاتب الموقع الخارجي. ليس أصعب شيء في العالم لبناءه الكثير من المسؤولين ، لكنه لا يزال يمثل مستوى مرتفعًا جدًا. إذا اعتقد الناس أن هذا هو أفضل طريق ، فمن المرجح أن أكتب الحل الخاص بي وأوثقه في README.md . في النهاية ، يمكن إنشاء واجهة مستخدم في الموزع لإدارة ذلك.

على أي حال ، ابحث عن ملاحظات حول المسار الذي يجب أن يسلكه أو مسار مختلف تمامًا. أنا أتطلع لإنجاز ذلك في أسرع وقت ممكن وسأرسل بالطبع أي تغييرات على المكون الإضافي.

Enterprise support enhancement

ال 9 كومينتر

كتبنا تطبيق المشاركة الخاص بنا واستخدمنا عنوان البريد الإلكتروني للمؤلف للاستعلام عن المعرف في الموقع المستلم. يفترض هذا أن المؤلفين يستخدمون نفس عنوان البريد الإلكتروني على كافة المواقع في الشبكة.

شكرًا للنصيحةdleeward ، لقد انتهيت للتو من اختراق بعض التعليمات البرمجية التي يمكن أن تعيش في وظائف السمة الخاصة بك لمزامنة المؤلفين أثناء الدفع. سيحاول العثور على المؤلف من خلال عنوان البريد الإلكتروني الذي تم تمريره. إذا تعذر العثور على مستخدم موجود ، يتم إنشاء مستخدم بخصائص من 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. هذا يفترض أنك لا تنشئ أكثر من مستخدم واحد في الثانية. يمكنك استخدام microtime أو إضافة لاحقة عشوائية بدلاً من ذلك.

لقد ناقشنا هذا كثيرًا.

بشكل عام ، نعتقد أن النشر كمستخدم مصدق عليه هو الحل الأكثر أمانًا للجميع. نرى بالتأكيد ناشرين مختلفين قد يكون لديهم متطلبات مختلفة. يؤدي إنشاء مستخدم جديد على الموقع البعيد إلى فتح الكثير من الأسئلة الصعبة. ما هو دور المستخدمين الجدد؟ هل ينبغي أن يكون الوصول إلى هذا الحساب من قبل المؤلف الأصلي؟

بالطبع هذا مفتوح للمناقشة ، ونود سماع آراء أخرى ، ولكن أفضل ما يمكننا فعله الآن هو إضافة خطافات / فلاتر إضافية لتسهيل إنجاز @ robbiet480 .

شيء واحد يجب ملاحظته ، هو أن العديد من المنشورات تحتاج إلى دعم مؤلفين متعددين للمحتوى ، وفي هذه الحالات ، غالبًا ما لا يتم استخدام "المستخدمون" حتى في علاقة المحتوى بالمؤلف.

عندما كنت أعمل على نشر المحتوى في سوق دبي المالي ، استخدمنا Co-Authors Plus الذي كان حلاً مختلطًا للنوع اللاحق / التصنيف لإضافة العديد من المؤلفين إلى المنشورات ، لذلك في حالتنا ، نحن في الواقع نريد أن يكون المستخدم المعتمد متصلاً بالمنشور باعتباره مؤلف المحتوى المرخص ، لذلك كان لدينا أثر لما تسبب فيه المستخدم في المشاركة ، وقمنا بتجميع بيانات إضافية للتعامل مع علاقة المحتوى بالمؤلفين <-> (تشبه إلى حد ما كيفية التعامل مع العلاقات مع الوسائط)

نقدر ردود الفعل ، جايسون!

لذا فقد اتخذت هذه الخطوة إلى الأمام الآن وقمت بالفعل بإضافة الدعم لـ 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);

رد: الاستعلام الأصلي حول التوزيع مع المؤلفين ، أود أن أقول إن CAP يمكن أن يكون حلاً جيدًا لسد الفجوة للسماح للموزع بضمان اعتماد المؤلف المناسب مع عدم الحاجة إلى القلق بشأن الأشياء التي ذكرها @ tlovett1 مثل الدور الذي يجب أن يكون جديدًا المستخدمين لديهم ومثل. علاوة على ذلك ، أعتقد أنه سيكون من المنطقي إضافة المزيد من علامات القوالب لفضح معلومات مثل المؤلف الأصلي إلى الواجهة الأمامية تمامًا مثلما يمكننا الآن كشف اسم الموقع الأصلي.

أرغب في منع هذه المشكلة من خلال القرار الذي سيتم اتخاذه في رقم 131. إذا اتضح أن هذا القرار هو أن الموزع سيدعم المكونات الإضافية الخارجية أكثر من الدعم عبر الخطافات / المرشحات ، فيمكننا حينئذٍ مواصلة التحقيق في هذه المشكلة المحددة مع Co-Authors Plus وكيف يمكن تضمينها بشكل رشيق مع / بجانب الموزع. إذا اتبع الموزع نهج الخطافات / المرشحات فقط ، فمن المحتمل أن نغلق هذه المشكلة (ونأمل أن نربطها بمثال الريبو لرمز الامتداد Co-Authors Plus).

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات