Чтобы сделать кнопку "Подписаться на автора Wordpress", нужен недостающий ингредиент


Итак, я пытаюсь создать кнопку "подписаться" в wordpress, где пользователи могут нажимать кнопку, которая позволяет им подписываться на автора, который им нравится. (Нет, меня не интересует buddypress)

Что я сделал до сих пор, так это использовал код из пост-подобной системы Джона Мастерсона для WordPress http://hofmannsven.com/2013/laboratory/wordpress-post-like-system /, который в значительной степени добавляет +1 update_post_meta, когда пользователю нравится сообщение.

Проблема, с которой я столкнулся, заключается в том, что если если вы пройдете весь путь до конца, вы увидите, что система like использует update_post_meta, чтобы дать +1 к количеству мета-сообщений, что именно то, что мне нужно для кнопки "Следовать". Проблема в том, что я не могу найти функцию update_author_meta для хранения ++$author_follow_count для этого конкретного автора. Если вы знаете, как мне сохранить и обновить количество подписчиков для конкретного автора или указать мне правильное направление, это было бы очень полезно оцененный.

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

Обновление

Хорошо, я повозился с (4) и использовал ваш код. По какой-то причине количество подписчиков по умолчанию по-прежнему равно 1. Также, где я могу разместить кубик для аякса? Спасибо

/**
* (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');

Еще одна проблема

Я вручную выполнил приведенный ниже код, просто чтобы посмотреть, влияет ли количество, и по какой-то причине это не так, и просто остается на 1.

$user_id = 1;
$author_id = 118;
wp_set_object_terms( $user_id, $author_id, 'wpse_180398_followers', true );
Author: Julian, 2015-03-06

1 answers

Я бы посоветовал вам не использовать мету пользователя. Хотя ваша проблема вызвана:

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

Обратите внимание, что вы вызвали update_ сообщение _мета не обновляется_ пользователь _meta, значит, где-то есть запись, идентификатор которой совпадает с идентификатором пользователя автора, в которую добавляется странная мета-запись.

Тем не менее, это все еще неэффективный метод, и он подвержен условиям гонки, которые могут привести к неточным подсчетам. У вас также будет очень дорогостоящий фрагмент кода при попытке выяснить, кто следует за автором, потому что вам придется проверять каждого отдельного пользователя, чтобы увидеть, следуют ли они за этим автором.

Вместо используйте пользовательскую таксономию.

Использование пользовательской таксономии пользователя

Таксономии предназначены не только для постов. В этой таксономии термины являются авторами, а помечаемые объекты - пользователями (в частности, мы используем идентификаторы пользователей в качестве наших слизней).

Предполагая, что мы называем эту таксономию 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.
} else {
    // Success!
}

Чтобы отписаться от кого-то:

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

Для проверьте, следует ли пользователь за автором:

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

Для привлечения подписчиков автора:

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

До получить количество подписчиков авторов:

count( $followers );

Чтобы получить авторов, за которыми следует пользователь:

$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
}

Дополнительные преимущества:

  • Это те же API, которые используются для категорий и тегов, они будут значительно быстрее, чем при использовании пользовательских мета
  • Нет условий гонки по срокам
  • Иногда количество терминов кэшируется
  • У вас будет таксономия, что означает архив шаблонов для каждого термина и структуру URL-адресов бесплатно!

Вы захотите, чтобы ваша таксономия была неиерархической, вы, вероятно, захотите изменить префикс имени, которое я дал, на что-то более уникальное для вас (не называйте это просто подписчиками), и если вам нужен пользовательский интерфейс в интерфейсе администратора , вы захотите прочитать это

Единственное другое замечание - вы можете захотеть удалить термин, связанный с пользователем, когда они будут удалены. Чтобы удалить термин или удалить всех подписчиков пользователя:

wp_delete_term( $author_id, 'wpse_180398_followers' );

К сбросить, кому пользователь следует, никому:

wp_delete_object_term_relationships( $user_id, 'wpse_180398_followers' );

Советы для Самой Кнопки

Поскольку в вашем вопросе уже есть конечная точка AJAX, вы можете удалить большую часть кода внутри нее и заменить его приведенными выше фрагментами. Что касается кнопки, вам понадобится элемент:

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

Это также переключатель, поэтому ему понадобится что-то, чтобы указать, следуете ли вы уже или нет:

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

Конечно, если у него есть класс following, измените его внешний вид, когда вы видите кнопку "Подписаться на твиттер". Вам понадобится следующий класс только в том случае, если вы действительно следите за этим человеком:

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

И, конечно, ему каким-то образом нужен идентификатор автора, давайте использовать атрибут данных:

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

Я надеюсь, вы знаете, как получить идентификатор автора основываясь на вашем вопросе.

Наконец, вам понадобится javascript, чтобы, когда пользователь нажимает кнопку "Следовать" (jQuery( 'a.follow-button').click, он:

  • проверяет, имеет ли элемент класс following
  • Если это так, он запускает AJAX, чтобы отменить подписку на автора
  • Если это не так, он запускает AJAX, чтобы следовать за автором
  • Он передает значение данных автора элемента (.data( 'author' ) в jQuery)
  • Он переключает класс following на элементе, чтобы пользователь получил некоторую обратную связь ( .toggle('following') )
  • Бонусные баллы за добавление класса follow-in-progress, который добавляет счетчик в css и выводит javascript из строя, если он взят, чтобы вы не дублировали запросы
 11
Author: Tom J Nowell, 2015-03-06 20:32:51