Distributor: Mendistribusikan posting dengan penulis yang benar

Dibuat pada 23 Feb 2018  ·  9Komentar  ·  Sumber: 10up/distributor

Kami memiliki jaringan situs yang cukup besar. Semuanya harus menunjukkan informasi penulis yang tepat. Saya melihat bahwa mulai sekarang Distributor akan mengatur penulis posting terdistribusi ke ID pengguna yang diautentikasi. Saya ingin mengubah ini (dan saya bersedia melakukan pekerjaan itu sendiri). Berikut dua solusi yang mungkin:

  1. Metode paling sederhana adalah dengan hanya melewati ID pengguna dari penulis posting asli dan menyerahkannya kepada admin untuk memastikan ID pengguna mereka disinkronkan di semua situs. Ini menjadi sedikit lebih mudah jika Anda menggunakan semacam plugin SSO.
  2. Tambahkan pengait ke pembuatan pos (atau gunakan dt_item_mapping yang ada untuk tarikan atau dt_push_post_args untuk filter push) untuk memungkinkan meneruskan ID penulis "benar" berdasarkan ID penulis pos yang ada dan situs apa kami posting ke. Ini akan membutuhkan pengguna akhir untuk memiliki peta atau database ID penulis situs saat ini ke ID penulis situs eksternal. Bukan hal tersulit di dunia untuk dibangun oleh banyak admin, tetapi masih merupakan standar yang cukup tinggi. Jika orang berpikir ini adalah rute terbaik, kemungkinan besar saya akan menulis solusi saya sendiri dan mendokumentasikannya dalam README.md . Akhirnya, UI dapat dibuat di Distributor untuk mengelola ini.

Lagi pula, mencari umpan balik di jalur mana yang harus dilalui atau jalur yang sama sekali berbeda. Saya ingin menyelesaikan ini secepatnya dan tentu saja akan mengirimkan kembali perubahan apa pun ke plugin.

Enterprise support enhancement

Semua 9 komentar

Kami menulis aplikasi sindikasi kami sendiri dan menggunakan alamat email penulis untuk menanyakan situs penerima untuk ID. Ini mengasumsikan penulis menggunakan alamat email yang sama di semua situs dalam jaringan.

Terima kasih atas tipnya @dleeward , saya baru saja selesai meretas beberapa kode yang dapat hidup di functions.php tema Anda untuk menyinkronkan penulis selama push. Ini akan mencoba menemukan penulis dengan alamat email yang diteruskan. Jika pengguna yang ada tidak dapat ditemukan, pengguna dibuat dengan properti dari push WP. Ini belum diuji dengan baik dan belum boleh digunakan dalam produksi.

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 Anda tidak boleh berasumsi bahwa user_login dan user_nicename penulis asli belum digunakan. Kami membuat nama pengguna arbitrer dari waktu unix saat ini yang diawali dengan string teks pendek seperti ABC1519562843. Ini mengasumsikan Anda tidak membuat lebih dari satu pengguna per detik. Anda dapat menggunakan waktu mikro atau menambahkan sufiks acak sebagai gantinya .

Kami telah banyak membahas yang satu ini.

Secara umum, kami percaya memposting sebagai pengguna yang diautentikasi adalah solusi paling aman yang paling kompatibel untuk semua orang. Kami pasti melihat penerbit yang berbeda mungkin memiliki persyaratan yang berbeda. Membuat pengguna baru di situs jarak jauh membuka banyak pertanyaan sulit. Apa peran pengguna baru? Haruskah akun itu dapat diakses oleh penulis aslinya?

Tentu saja ini terbuka untuk diskusi, dan kami ingin mendengar pendapat lain, tetapi untuk saat ini yang terbaik yang dapat kami lakukan adalah menambahkan kait/filter tambahan untuk mempermudah pencapaian @robbiet480 .

Satu hal yang perlu diperhatikan, adalah bahwa banyak publikasi memiliki kebutuhan untuk mendukung banyak penulis untuk konten, dan dalam kasus tersebut, "Pengguna" sering kali tidak digunakan untuk hubungan konten <-> penulis.

Ketika saya sedang mengerjakan sindikasi konten di DFM, kami menggunakan Co-Authors Plus yang merupakan solusi tipe pasca/taksonomi hibrida untuk menambahkan banyak penulis ke pos, jadi dalam kasus kami, kami sebenarnya _menginginkan_ pengguna yang diautentikasi untuk terhubung ke pos sebagai pembuat konten sindikasi, jadi kami memiliki jejak pengguna yang memicu sindikasi, dan kami mensindikasikan data tambahan untuk menangani hubungan konten<->pengarang (agak mirip dengan bagaimana hubungan dengan media ditangani)

Hargai umpan baliknya, Jason!

Jadi saya telah mengambil langkah lebih jauh sekarang dan benar-benar menambahkan dukungan untuk Co-Authors Plus ke Distributor melalui kait. Ini kode saya untuk orang lain yang tertarik dengan integrasi. Saya telah menanyakan di #131 tentang penyertaan dalam 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: pertanyaan asli tentang pendistribusian dengan penulis, saya akan mengatakan bahwa CAP bisa menjadi solusi jeda yang baik untuk memungkinkan Distributor memastikan penulis yang tepat dikreditkan sementara tidak perlu khawatir tentang hal-hal yang disebutkan @tlovett1 seperti peran apa yang harus baru pengguna memiliki dan semacamnya. Lebih jauh lagi, saya pikir akan sangat masuk akal untuk menambahkan lebih banyak tag template untuk mengekspos informasi seperti penulis asli ke frontend seperti bagaimana kita sekarang dapat mengekspos nama situs asli.

Saya ingin memblokir masalah ini dengan keputusan yang akan dibuat di #131. Jika keputusan itu ternyata Distributor akan mendukung plugin eksternal lebih dari melalui kait/filter, maka kami dapat terus menyelidiki masalah khusus ini dengan Co-Authors Plus dan bagaimana hal itu dapat dengan baik disertakan dengan/bersama Distributor. Jika Distributor mengambil pendekatan kait/filter saja, maka kemungkinan kami akan menutup masalah ini (dan mudah-mudahan menautkan ke contoh repo untuk kode ekstensi Co-Authors Plus).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

john-lynch-cp picture john-lynch-cp  ·  3Komentar

avag-novembit picture avag-novembit  ·  3Komentar

superbuggy picture superbuggy  ·  7Komentar

ahovhannissian picture ahovhannissian  ·  4Komentar

jeffpaul picture jeffpaul  ·  5Komentar