Distributor: Distribuindo posts com o autor correto

Criado em 23 fev. 2018  ·  9Comentários  ·  Fonte: 10up/distributor

Temos uma rede bastante grande de sites. Todos eles precisam mostrar as informações corretas do autor. Vejo que, a partir de agora, o Distribuidor definirá o autor das postagens distribuídas para o ID dos usuários autenticados. Eu gostaria de mudar isso (e estou disposto a fazer o trabalho sozinho). Aqui estão duas soluções possíveis:

  1. O método mais simples é apenas passar pelo ID de usuário do autor da postagem original e deixar para os administradores garantir que seus IDs de usuário sejam sincronizados em todos os sites. Isso fica um pouco mais fácil se você estiver usando algum tipo de plug-in SSO.
  2. Adicione um gancho à criação da postagem (ou use o dt_item_mapping existente para o filtro pull ou dt_push_post_args para o filtro push) para permitir a passagem do ID do autor "correto" com base no ID do autor do post existente e em qual site estamos postando. Isso exigiria que os usuários finais tivessem um mapa ou banco de dados do ID do autor do site atual para o ID do autor do site externo. Não é a coisa mais difícil do mundo para muitos administradores construirem, mas ainda é um nível bastante alto. Se as pessoas acharem que esse é o melhor caminho, eu provavelmente escreveria minha própria solução e a documentaria em README.md . Eventualmente, uma interface do usuário pode ser criada no Distribuidor para gerenciar isso.

De qualquer forma, procurando feedback sobre qual caminho seguir ou um caminho completamente diferente. Estou procurando fazer isso o mais rápido possível e, é claro, enviaria quaisquer alterações no plug-in de volta.

Enterprise support enhancement

Todos 9 comentários

Escrevemos nosso próprio aplicativo de distribuição e usamos o endereço de e-mail do autor para consultar o site de recebimento do ID. Isso pressupõe que os autores usem o mesmo endereço de e-mail em todos os sites da rede.

Obrigado pela dica @dleeward , acabei de hackear alguns códigos que podem ficar no seu tema functions.php para sincronizar autores durante um push. Ele tentará encontrar o autor pelo endereço de e-mail passado. Se um usuário existente não puder ser encontrado, um usuário será criado com as propriedades do WP de envio. Isso ainda não foi bem testado e ainda não deve ser usado em produção.

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 Você não deve assumir que o user_login e user_nicename do autor original já não estão sendo usados. Criamos um nome de usuário arbitrário da hora unix atual prefixado com uma string de texto curta, como ABC1519562843. Isso pressupõe que você não esteja criando mais de um usuário por segundo. Você pode usar microtime ou adicionar um sufixo aleatório.

Nós discutimos muito isso.

Geralmente, acreditamos que postar como usuário autenticado é a solução mais segura e compatível para todos. Definitivamente, vemos que diferentes editores podem ter requisitos diferentes. Criar um novo usuário no site remoto abre muitas perguntas difíceis. Qual é a função dos novos usuários? Essa conta deve ser acessível pelo autor original?

É claro que isso está aberto para discussão, e adoraríamos ouvir outras opiniões, mas por enquanto o melhor que podemos fazer é adicionar ganchos/filtros adicionais para facilitar o que @robbiet480 realizou.

Uma coisa a notar, é que muitas publicações têm a necessidade de oferecer suporte a vários autores para o conteúdo e, nesses casos, "Usuários" muitas vezes nem são usados ​​para a relação autor <-> conteúdo.

Quando eu estava trabalhando na distribuição de conteúdo no DFM, usamos o Co-Authors Plus, que era uma solução híbrida de tipo de postagem/taxonomia para adicionar muitos autores a postagens, então, em nosso caso, nós realmente _queríamos_ que o usuário autenticado fosse conectado à postagem como o autor do conteúdo distribuído, portanto, tivemos uma trilha de qual usuário acionou a distribuição e distribuímos dados adicionais para lidar com o relacionamento autores<->conteúdo (um pouco semelhante a como os relacionamentos com a mídia são tratados)

Agradeço o feedback, Jason!

Então, eu dei um passo adiante agora e realmente adicionei suporte para Co-Authors Plus ao Distributor por meio de ganchos. Aqui está o meu código para qualquer pessoa interessada na integração. Perguntei no nº 131 sobre a inclusão no Distribuidor.

<?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: a consulta original sobre distribuição com autores, eu diria que o CAP pode ser uma boa solução de interrupção para permitir que o Distribuidor garanta que o autor adequado seja creditado sem precisar se preocupar com coisas que @tlovett1 mencionou, como qual papel deve ser novo os usuários têm e tal. Além disso, acho que faria muito sentido adicionar mais tags de modelo para expor informações como autor original para o frontend, assim como agora podemos expor o nome do site original.

Eu gostaria de bloquear este problema pela decisão a ser tomada no nº 131. Se essa decisão for que o Distribuidor oferecerá suporte a plug-ins externos mais do que por meio de ganchos/filtros, podemos continuar investigando esse problema específico com o Co-Authors Plus e como ele pode ser incluído com/ao lado do Distribuidor. Se o Distribuidor adotar a abordagem apenas de ganchos/filtros, é provável que fechemos esse problema (e esperamos um link para um repositório de exemplo para o código de extensão Co-Authors Plus).

Esta página foi útil?
0 / 5 - 0 avaliações