web-dev-qa-db-fra.com

Rendre l'auteur de Wordpress suivre le bouton, il manque un ingrédient

J'essaie donc de créer un bouton de suivi dans WordPress où les utilisateurs peuvent appuyer sur un bouton qui leur permet de suivre un auteur qu'ils aiment. (Non, je ne suis pas intéressé par buddypress)

Ce que j’ai fait jusqu’à présent, c’est d’utiliser le code de Post Like System de Jon Masterson pour WordPress http://hofmannsven.com/2013/laboratory/wordpress-post-like-system/ qui ajoute un +1 update_post_meta à chaque fois qu'un utilisateur aime la publication.

Le problème que j'ai rencontré est que si vous allez jusqu'au bout, vous verrez que le même système utilise update_post_meta pour donner +1 au compte de la méta de l'article, ce qui est exactement ce dont j'ai besoin pour la suite. bouton. Le problème est que je ne trouve pas de fonction update_author_meta pour stocker le ++ $ author_follow_count pour cet auteur spécifique. Si vous connaissez un moyen pour moi de stocker et de mettre à jour le nombre de suivis pour un auteur spécifique, ou de me diriger dans la bonne direction, ce serait grandement apprécié.

<?php
function follow_scripts() {
wp_localize_script( 'jk_like_post', 'ajax_var', array(
    'url' => admin_url( 'admin-ajax.php' ),
    'nonce' => wp_create_nonce( 'ajax-nonce' )
        )
    );
}
add_action( 'init', 'follow_scripts' );

/**
* (2) Save follow data
*/
add_action( 'wp_ajax_nopriv_jk-author-follow', 'jk_author_follow' );
add_action( 'wp_ajax_jk-author-follow', 'jk_author_follow' );
function jk_author_follow() {
   $nonce = $_POST['nonce'];
if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
        die ( 'Nope!' );

if ( isset( $_POST['jk_author_follow'] ) ) {

    $author_id = $_POST['author_id']; // author id
    $author_follow_count = get_author_meta( $author_id,        "_author_follow_count", true ); // author follow count

    if ( function_exists ( 'wp_cache_post_change' ) ) { // invalidate WP Super Cache if exists
                $GLOBALS["super_cache_enabled"]=1;
                wp_cache_post_change( $post_id );
    }

    if ( is_user_logged_in() ) { // user is logged in
        $user_id = get_current_user_id(); // current user
        $meta_AUTHORS = get_user_option( "_followed_authors", $user_id ); // author ids from user meta
        $meta_USERS = get_author_meta( $author_id, "_user_followed" ); //user ids from author meta
        $followed_AUTHORS = NULL; // setup array variable
        $followed_USERS = NULL; // setup array variable

        if ( count( $meta_Authors ) !=0 ) { // meta exists, set up values
            $followed_AUTHORS = $meta_AUTHORS;
        }

        if ( !is_array( $followed_AUTHORS ) )  // make array just in case
            $followed_AUTHORS = array();

        if ( count( $meta_USERS ) !=0 ) { // meta exists, set up values
            $followed_USERS = $meta_USERS[0];
        }

        if ( !is_array( $followed_USERS ) ) //make an array just in case
            $followed_USERS = array();

        $followed_AUTHORS['author-'.$author_id, "_user_followed"] = $author_id; // Add author id to user meta array
        $followed_USERS['user-'.$user_id] = $user_id; // add user id to author meta array
        $user_follows = count( $followed_AUTHORS ); // count user follows

 // *** Where the snag is ****
        if ( !AlreadyFollowed( $author_id ) ) { // follow the author
            update_post_meta( $author_id, "_user_followed", $followed_USERS ); // Add user ID to author meta
            update_post_meta( $author_id, "_author_follow_count", ++$author_follow_count ); // +1 count author meta
            update_user_option( $user_id, "_followed_authors", $followed_Authors ); // Add author ID to user meta
            update_user_option( $author_id, "_author_follow_count", $user_follows ); // +1 count user meta
            echo $author_follow_count; // update count on front end

Mettre à jour

D'accord, j'ai tripoté (4) et utilisé votre code. Pour une raison quelconque, le nombre d'abonnés par défaut est toujours égal à 1. Également, où dois-je placer le dé pour l'ajax? Merci

/**
* (1) Enqueue scripts for follow system
*/
function follow_scripts() {
wp_enqueue_script( 'jk_follow_post', get_template_directory_uri().'/js/post-   like.min.js', array('jquery'), '1.0', 1 );
 wp_localize_script( 'jk_like_post', 'ajax_var', array(
    'url' => admin_url( 'admin-ajax.php' ),
    'nonce' => wp_create_nonce( 'ajax-nonce' )
        )
    );
}
/**
* (2) Save follow data
*/
add_action( 'wp_ajax_nopriv_jk-author-follow', 'jk_author_follow' );
add_action( 'wp_ajax_jk-author-follow', 'jk_author_follow' );
function jk_author_follow() {
$nonce = $_POST['nonce'];
if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
        die ( 'Nope!' );

if ( isset( $_POST['jk_author_follow'] ) ) {

    $author_id = $_POST['author_id']; // author id


    if ( is_user_logged_in() ) { // user is logged in
        $user_id = get_current_user_id(); // current user

        // create the term if it doesn't exist
        if ( !term_exists( $author_id, 'wpse_180398_followers' ) ) {
            wp_insert_term( $author_id, 'wpse_180398_followers' );
        }

        // follow the user, note the last argument is true
        $term_ids = wp_set_object_terms( $user_id, $author_id, 'wpse_180398_followers', true );

        if ( is_wp_error( $term_ids ) ) {
            // There was an error somewhere and the terms couldn't be set.
            echo "error";
        } else {
            // Success!
        }
    }
}
}
/**
 * (3) Test if user already liked post
 */
function AlreadyFollowed( $author_id ) { // test if user is following author
$user_id = get_current_user_id(); // current user
$author_id = $_POST['author_id']; // author id
if ( is_user_logged_in() ) { // user is logged in
    if ( has_term( $author_id, 'wpse_180398_followers', $user_id ) ) {
        // user_id is following author_id!
    }
}
}
/**
  * (4) Front end button
*/
function getFollowLink( $author_id ) {
$following = '';
$author_id = get_query_var('author');
$user_id = get_current_user_id(); // current user
if (has_term( $author_id, 'wpse_180398_followers', $user_id )) {
    $following = ' following';
}
echo '<a class="follow-button' .$following. '" data-author="' .$author_id.  '">Follow</a>';
}
/**
 * (5) Add a shortcode to your posts instead
 * type [jkfollower] in your post to output the button
*/
function jk_follow_shortcode() {
return getFollowLink( get_the_ID() );
}
add_shortcode('jkfollower', 'jk_follow_shortcode');

Un autre problème

J'ai manuellement exécuté le code ci-dessous juste pour voir si le nombre est affecté, et pour une raison quelconque ce n'est pas le cas, et reste à 1.

$user_id = 1;
$author_id = 118;
wp_set_object_terms( $user_id, $author_id, 'wpse_180398_followers', true );
2
Julian

Je vous conseillerais de ne pas utiliser la méta utilisateur. Bien que votre problème soit causé par:

update_post_meta( $author_id, "_user_followed", $followed_USERS ); // Add user ID to author meta
update_post_meta( $author_id, "_author_follow_count", ++$author_follow_count );

notez que vous avez appelé update _ post _ méta non update _ utilisateur _ meta, alors quelque part, il y a une publication dont l'ID est identique à l'ID utilisateur de l'auteur.

Cependant, cela reste une méthode inefficace et sujette à des conditions de concurrence qui pourraient donner des chiffres inexacts. Vous allez également avoir un morceau de code très coûteux lorsque vous essayez de comprendre qui suit un auteur, car vous devrez vérifier chaque utilisateur pour voir s'il suit cet auteur.

À la place , utilisez une taxonomie personnalisée.

Utilisation d'une taxonomie utilisateur personnalisée

Les taxonomies ne se limitent pas aux publications. Dans cette taxonomie, les termes sont des auteurs et les objets marqués sont des utilisateurs (en particulier, nous utilisons des identifiants d’utilisateur comme slug).

En supposant que nous appelons cette taxonomie wpse_180398_followers, pour suivre un auteur:

// follow the user, note the last argument is true
$term_ids = wp_set_object_terms( $user_id, $author_id, 'wpse_180398_followers', true );

if ( is_wp_error( $term_ids ) ) {
    // There was an error somewhere and the terms couldn't be set.
} else {
    // Success!
}

Pour désabonner quelqu'un :

wp_remove_object_terms( $user_id, $author_id, 'wpse_180398_followers' );

To vérifie si un utilisateur suit un auteur :

if ( has_term( $author_id, 'wpse_180398_followers', $user_id ) ) {
    // user_id is following author_id!
}

Pour obtenir les abonnés d'un auteur :

$followers = get_objects_in_term( $author_id, 'wpse_180398_followers' );

Pour obtenir un compte auteur suiveur :

count( $followers );

Pour obtenir les auteurs suivis par un utilisateur :

$author_terms = wp_get_object_terms( $user_id, 'wpse_180398_followers' );
foreach ( $author_terms as $term ) {
    echo $term->slug; // the slug is the author ID
}

Autres avantages:

  • Ce sont les mêmes API utilisées pour les catégories et les balises, elles seront bien plus rapides que l’utilisation de méta utilisateur.
  • Aucune condition de course sur le nombre de mandats
  • Les comptes sont parfois mis en cache
  • Vous aurez une taxonomie, ce qui signifie des modèles d'archive pour chaque terme et une structure d'URL gratuitement!

Vous voudrez que votre taxonomie ne soit pas hiérarchique, vous voudrez probablement changer le préfixe du nom que je lui ai donné en quelque chose de plus unique pour vous (ne vous contentez pas d'appeler cela des suiveurs), et si vous voulez une interface utilisateur dans l'interface d'administration , vous voudrez lire ceci

La seule autre remarque est que vous souhaitez peut-être supprimer le terme associé à un utilisateur lorsqu'il est supprimé. Pour supprimer le terme ou supprimer tous les abonnés d'un utilisateur :

wp_delete_term( $author_id, 'wpse_180398_followers' );

Pour réinitialiser les utilisateurs qui suivent personne :

wp_delete_object_term_relationships( $user_id, 'wpse_180398_followers' );

Conseils pour le bouton lui-même

Comme vous avez déjà un noeud final AJAX dans votre question, vous pouvez supprimer la plupart du code qu'il contient et le remplacer par les extraits ci-dessus. Quant au bouton, vous aurez besoin d'un élément:

<a class="follow-button">Follow</a>

C'est aussi une bascule, il faudra donc quelque chose pour indiquer si vous suivez déjà ou non:

<a class="follow-button following">Follow</a>

Bien sûr, si vous avez la classe following, modifiez son apparence lorsque vous voyez un bouton Suivre de Twitter. Si vous suivez réellement la personne, vous ne voudrez que le cours suivant:

<?php
$following = '';
if ( has_term.. etc as above ) {
    $following = ' following';
}
?>
<a class="follow-button<?php echo $following; ?>">Follow</a>

Et bien sûr, il a besoin de l'identifiant de l'auteur d'une certaine manière, permet d'utiliser un attribut de données:

<?php
$following = '';
if ( has_term.. etc as above ) {
    $following = ' following';
}
?>
<a class="follow-button<?php echo $following; ?>" data-author="<?php echo $author_id; ?>">Follow</a>

J'espère que vous savez comment obtenir l'identifiant de l'auteur en fonction de votre question.

Enfin, vous aurez besoin de javascript pour que lorsqu'un utilisateur clique sur un bouton Suivre (jQuery( 'a.follow-button').click, il:

  • vérifie si l'élément a la classe following
  • Si tel est le cas, il déclenche un AJAX pour ne plus suivre l'auteur.
  • Si ce n'est pas le cas, il déclenche un AJAX pour suivre l'auteur.
  • Il transmet la valeur de données d'auteur de l'élément (.data( 'author' ) dans jQuery)
  • Il bascule la classe following sur l'élément afin que l'utilisateur reçoive des commentaires (.toggle('following'))
  • Points bonus pour l'ajout d'une classe follow-in-progress qui ajoute un spinner en css et permet de sortir le javascript de son exécution si elle est récupérée afin de ne pas dupliquer les demandes
11
Tom J Nowell