Distributor: Distribuir publicaciones con el autor correcto

Creado en 23 feb. 2018  ·  9Comentarios  ·  Fuente: 10up/distributor

Tenemos una red bastante grande de sitios. Todos ellos deben mostrar la información adecuada del autor. Veo que, a partir de ahora, el distribuidor establecerá el autor de las publicaciones distribuidas en la identificación de los usuarios autenticados. Me gustaría cambiar esto (y estoy dispuesto a hacer el trabajo yo mismo). Aquí hay dos posibles soluciones:

  1. El método más simple es simplemente pasar la identificación de usuario del autor de la publicación original y dejar que los administradores se aseguren de que sus identificaciones de usuario estén sincronizadas en todos los sitios. Esto se vuelve un poco más fácil si está utilizando un complemento SSO de algún tipo.
  2. Agregue un gancho a la creación de la publicación (o use el dt_item_mapping existente para el filtro de extracción o dt_push_post_args para el filtro de inserción) para permitir pasar la ID de autor "correcta" según la ID de autor de la publicación existente y qué sitio estamos publicando. Esto requeriría que los usuarios finales tengan un mapa o una base de datos de la ID del autor del sitio actual a la ID del autor del sitio externo. No es lo más difícil del mundo para muchos administradores, pero sigue siendo un listón bastante alto. Si la gente piensa que esta es la mejor ruta, lo más probable es que escriba mi propia solución y la documente en README.md . Eventualmente, se podría crear una interfaz de usuario en Distributor para administrar esto.

De todos modos, buscando comentarios sobre qué camino seguir o un camino completamente diferente. Estoy buscando hacer esto lo antes posible y, por supuesto, enviaría cualquier cambio al complemento.

Enterprise support enhancement

Todos 9 comentarios

Escribimos nuestra propia aplicación de sindicación y usamos la dirección de correo electrónico del autor para consultar el ID del sitio receptor. Esto supone que los autores utilizan la misma dirección de correo electrónico en todos los sitios de la red.

Gracias por el consejo @dleeward , acabo de terminar de compilar un código que puede vivir en su tema functions.php para sincronizar a los autores durante un impulso. Intentará encontrar al autor por la dirección de correo electrónico pasada. Si no se puede encontrar un usuario existente, se crea un usuario con las propiedades del WP de envío. Esto aún no ha sido bien probado y aún no debe usarse en producción.

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 No debe suponer que el nombre de usuario y el usuario_nicename del autor original ya no se están utilizando. Creamos un nombre de usuario arbitrario de la hora actual de Unix con el prefijo de una cadena de texto corta como ABC1519562843. Esto supone que no está creando más de un usuario por segundo. Podría usar microtime o agregar un sufijo aleatorio en su lugar.

Hablamos mucho de esto.

En general, creemos que publicar como usuario autenticado es la solución más segura y compatible para todos. Definitivamente vemos que diferentes editores pueden tener diferentes requisitos. Crear un nuevo usuario en el sitio remoto abre un montón de preguntas difíciles. ¿Cuál es el rol de los nuevos usuarios? ¿Debería ser accesible esa cuenta por el autor original?

Por supuesto, esto está abierto a discusión, y nos encantaría escuchar otras opiniones, pero por ahora lo mejor que podemos hacer es agregar ganchos/filtros adicionales para facilitar lo que logró @robbiet480 .

Una cosa a tener en cuenta es que muchas publicaciones tienen la necesidad de admitir varios autores para el contenido y, en esos casos, los "Usuarios" a menudo ni siquiera se usan para la relación autor <-> contenido.

Cuando estaba trabajando en la sindicación de contenido en DFM, usamos Co-Authors Plus, que era una solución híbrida de tipo de publicación/taxonomía para agregar muchos autores a las publicaciones, por lo que en nuestro caso en realidad _queríamos_ que el usuario autenticado se conectara a la publicación como el autor del contenido sindicado, por lo que teníamos un rastro de qué usuario desencadenó la sindicación, y sindicamos datos adicionales para manejar la relación autores<->contenido (algo similar a cómo se manejan las relaciones con los medios)

¡Apreciamos los comentarios, Jason!

Así que he llevado esto un paso más allá ahora y de hecho agregué soporte para Co-Authors Plus to Distributor a través de ganchos. Aquí está mi código para cualquier otra persona interesada en la integración. He consultado en el n.º 131 sobre la inclusión en 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 consulta original sobre la distribución con autores, diría que CAP podría ser una buena solución provisional para permitir que el Distribuidor se asegure de que se acredite al autor adecuado sin tener que preocuparse por las cosas que mencionó @tlovett1 , como qué rol debería ser nuevo. los usuarios tienen y tal. Además, creo que tendría mucho sentido agregar más etiquetas de plantilla para exponer información como el autor original en la interfaz, tal como ahora podemos exponer el nombre del sitio original.

Me gustaría bloquear este problema con la decisión que se tomará en el n.º 131. Si esa decisión resulta ser que Distributor admitirá complementos externos más que a través de ganchos/filtros, entonces podemos continuar investigando este problema específico con Co-Authors Plus y cómo se puede incluir mejor con/junto con Distributor. Si Distributor adopta el enfoque de ganchos/filtros únicamente, es probable que cerremos este problema (y, con suerte, enlacemos a un repositorio de ejemplo para el código de extensión Co-Authors Plus).

¿Fue útil esta página
0 / 5 - 0 calificaciones