Distributor: Verteilen von Beiträgen mit korrektem Autor

Erstellt am 23. Feb. 2018  ·  9Kommentare  ·  Quelle: 10up/distributor

Wir haben ein ziemlich großes Netzwerk von Websites. Alle von ihnen müssen die richtigen Autoreninformationen anzeigen. Ich sehe, dass der Distributor ab sofort den Autor der verteilten Beiträge auf die ID des authentifizierten Benutzers setzt. Ich möchte dies ändern (und bin bereit, die Arbeit selbst zu erledigen). Hier sind zwei mögliche Lösungen:

  1. Die einfachste Methode besteht darin, einfach die Benutzer-ID des ursprünglichen Beitragsautors weiterzugeben und es den Administratoren zu überlassen, sicherzustellen, dass ihre Benutzer-IDs auf allen Websites synchronisiert werden. Dies wird etwas einfacher, wenn Sie eine Art SSO-Plugin verwenden.
  2. Fügen Sie einen Haken zur Beitragserstellung hinzu (oder verwenden Sie das vorhandene dt_item_mapping für den Pull- oder dt_push_post_args für den Push-Filter), um die Übergabe der „richtigen“ Autoren-ID basierend auf der vorhandenen Beitrags-Autoren-ID und der Website zu ermöglichen wir posten an. Dies würde erfordern, dass Endbenutzer eine Zuordnung oder Datenbank der aktuellen Site-Autoren-ID zur externen Site-Autoren-ID haben. Für viele Administratoren nicht das Schwierigste auf der Welt, aber immer noch eine ziemlich hohe Messlatte. Wenn die Leute denken, dass dies der beste Weg ist, würde ich höchstwahrscheinlich meine eigene Lösung schreiben und sie in README.md dokumentieren. Schließlich könnte im Verteiler eine Benutzeroberfläche erstellt werden, um dies zu verwalten.

Wie auch immer, ich suche nach Feedback, welchen Weg man gehen soll oder einen ganz anderen Weg. Ich möchte dies so schnell wie möglich erledigen und würde natürlich alle Änderungen am Plugin zurücksenden.

Enterprise support enhancement

Alle 9 Kommentare

Wir haben unsere eigene Syndication-Anwendung geschrieben und die E-Mail-Adresse des Autors verwendet, um die empfangende Site nach der ID abzufragen. Dies setzt voraus, dass Autoren auf allen Websites im Netzwerk dieselbe E-Mail-Adresse verwenden.

Danke für den Tipp @dleeward , ich habe gerade Code zusammen gehackt, der in deinem Theme functions.php leben kann, um Autoren während eines Pushs zu synchronisieren. Es wird versucht, den Autor anhand der übergebenen E-Mail-Adresse zu finden. Wenn kein vorhandener Benutzer gefunden werden kann, wird ein Benutzer mit den Eigenschaften aus dem pushenden WP erstellt. Dies wurde noch nicht gut getestet und sollte noch nicht in der Produktion verwendet werden.

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 Sie sollten nicht davon ausgehen, dass user_login und user_nicename des ursprünglichen Autors nicht bereits verwendet werden. Wir erstellen einen beliebigen Benutzernamen der aktuellen Unix-Zeit, dem eine kurze Textzeichenfolge wie ABC1519562843 vorangestellt wird. Dies setzt voraus, dass Sie nicht mehr als einen Benutzer pro Sekunde erstellen. Sie könnten stattdessen Microtime verwenden oder ein zufälliges Suffix hinzufügen.

Wir hatten darüber viel diskutiert.

Im Allgemeinen glauben wir, dass das Posten als authentifizierter Benutzer die sicherste und kompatibelste Lösung für alle ist. Wir sehen definitiv, dass verschiedene Publisher unterschiedliche Anforderungen haben können. Das Erstellen eines neuen Benutzers auf der Remote-Site wirft eine Menge schwieriger Fragen auf. Was ist die neue Benutzerrolle? Sollte dieses Konto für den ursprünglichen Autor zugänglich sein?

Natürlich ist dies offen für Diskussionen, und wir würden gerne andere Meinungen hören, aber im Moment können wir am besten zusätzliche Hooks/Filter hinzufügen, um das, was @robbiet480 erreicht hat, einfacher zu machen.

Eine Sache, die zu beachten ist, ist, dass viele Publikationen mehrere Autoren für Inhalte unterstützen müssen, und in diesen Fällen werden "Benutzer" oft nicht einmal für die Beziehung Autor <-> Inhalt verwendet.

Als ich bei DFM an der Syndizierung von Inhalten arbeitete, verwendeten wir Co-Authors Plus, eine hybride Beitragstyp/Taxonomie-Lösung zum Hinzufügen vieler Autoren zu Beiträgen. In unserem Fall _wollten_ wir also eigentlich, dass der authentifizierte Benutzer mit dem Beitrag verbunden wird als der Autor des syndizierten Inhalts, sodass wir eine Spur darüber hatten, welcher Benutzer die Syndizierung ausgelöst hat, und wir haben zusätzliche Daten syndiziert, um die Beziehung zwischen Autor und Inhalt zu handhaben (etwas ähnlich wie Beziehungen zu Medien gehandhabt werden).

Danke für das Feedback, Jason!

Also bin ich jetzt noch einen Schritt weiter gegangen und habe Distributor über Hooks Unterstützung für Co-Authors Plus hinzugefügt. Hier ist mein Code für alle anderen, die sich für die Integration interessieren. Ich habe in Nr. 131 nach der Aufnahme in den Distributor gefragt.

<?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);

Bezüglich der ursprünglichen Frage zum Verteilen mit Autoren würde ich sagen, dass CAP eine gute Notlösung sein könnte, damit der Verteiler sicherstellen kann, dass der richtige Autor genannt wird, ohne sich um Dinge kümmern zu müssen, die @tlovett1 erwähnt hat, wie z. B. welche Rolle neu sein sollte Benutzer haben und so. Außerdem denke ich, dass es sehr sinnvoll wäre, mehr Template-Tags hinzuzufügen, um Informationen wie den ursprünglichen Autor im Frontend anzuzeigen, so wie wir jetzt den ursprünglichen Site-Namen anzeigen können.

Ich möchte dieses Problem durch die zu treffende Entscheidung in #131 blockieren. Wenn sich herausstellt, dass der Distributor externe Plugins mehr als über Hooks/Filter unterstützt, können wir dieses spezielle Problem mit Co-Authors Plus weiter untersuchen und wie es am besten elegant mit/neben dem Distributor integriert werden kann. Wenn Distributor den reinen Hooks/Filter-Ansatz verfolgt, werden wir dieses Problem wahrscheinlich schließen (und hoffentlich auf ein Beispiel-Repo für den Co-Authors Plus-Erweiterungscode verlinken).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen