Wordpress - Top Authors list by highest post views with Ajax pagination

感情迁移 提交于 2019-12-11 07:45:48

问题


I'm trying to create an users list to sort all users by the highest post views for each user, I added $output = array_slice($topuser, 0, 10); to get 10 users when i click load more in the next page, but this is repeating the first 10 users only!

After searching i found is need to add $paged and $offset to get the next page for the next users!

How to make to work.

I'm highly appreciated your time and help.

here's all my code i have done.

authors-ranking-list.php

<?php 
function MostPopularArtistsFullList() {

    global $wp_query;

    $topuser = array();

    $avatar_size = 100;

    $args = array(
        'role__in'     => array('contributor', 'author'),
        'hide_empty'     => '1'
     ); 
    $users = get_users( $args );

    foreach ( $users as $user ) {    

        $query = get_posts( array('author' => $user->ID, 'cat' => '3', 'numberposts' => -1, 'post_type'  => 'post' ));
        $counter = 0;

        $post_count = count_user_posts( $user->ID );

        if ( ! $post_count ) {
            continue;
        }

        // get each post of a user
        foreach ( $query as $post ){
            $views = absint( get_post_meta( $post->ID, 'post_views_count', true ));
            $counter += $views;
        }
        $topuser[] = array( 
        'id' => $user->ID,
        'views' => $counter
        );
        wp_reset_query();
    }

    // function to sort array based on views count
    function sortViews($a, $b) {
        return $b['views'] - $a['views'];
    }
    usort($topuser, 'sortViews'); // sort the array

    $output = array_slice($topuser, 0, 10); // slice the array by limit 10

    $rank=0;
    $rankpostcount=0;

    echo '<div id="top-artists-contributors">';

    foreach ($output as $user){

    $rank++;
    $rankpostcount++;

        $query = get_posts( array('author' => $user['id'], 'cat' => '3', 'numberposts' => -1, 'post_type'  => 'post' ));
        $avatar = get_avatar($user['id'], $avatar_size);
        $author_profile_url = get_author_posts_url($user['id']);
        $profile = get_userdata($user['id']);

        // update the rank for each user
        update_user_meta( $user['id'], 'user_rank', $rank );

        if (count($query)) {

        echo '<div class="rankpostcount-'.$rankpostcount.' single-item-9">';

        echo '<div class="members-name-9"><a href="', $author_profile_url, '">' . $profile->first_name .'</a><div class="author-rank-9" title="Artist Rank">'.$rank.'</div></div>';

        echo '</div>';         
        }
    }

    echo '</div>';

?>
    <div class="load_more_posts"style="text-align:center;margin-bottom: 30px; width:100%; float:left;">
        <a id="load-more-rank-list" href="javascript:void(0)">Load more</a>
            <div class="loader" style="padding-top: 10px;"></div>
        <span class="no-more-post"></span>
    </div>  
<?php

}
add_shortcode('top-artists-full-list', 'MostPopularArtistsFullList');
?>

function.php

function loadMore() {

    global $wp_query;

    $no  = 9; 
    $page = (isset($_POST['pageNumber'])) ? $_POST['pageNumber'] : 2;
    $offset = ($page-1)*$no;

    $topuser = array();

    $avatar_size = 100;

    $args = array(
        'role__in'     => array('contributor', 'author'),
        'hide_empty'     => '1'
     ); 
    $users = get_users( $args );

    foreach ( $users as $user ) {       

        $query = get_posts( array('author' => $user->ID, 'cat' => '3', 'numberposts' => -1, 'post_type'  => 'post' ));
        $counter = 0;

    $post_count = count_user_posts( $user->ID );

        if ( ! $post_count ) {
            continue;
        }

        // get each post of a user
        foreach ( $query as $post ){
            $views = absint( get_post_meta( $post->ID, 'post_views_count', true ));
            $counter += $views;
        }
        $topuser[] = array( 
        'id' => $user->ID,
        'views' => $counter
        );
        wp_reset_query();
    }

    // function to sort array based on views count
    function sortViews($a, $b) {
        return $b['views'] - $a['views'];
    }
    usort($topuser, 'sortViews'); // sort the array

    $output = array_slice($topuser, 0, 10); // slice the array by limit 10

    $rank=0;
    $rankpostcount=0;

    echo '<div id="top-artists-contributors">';

    foreach ($output as $user){

    $rank++;
    $rankpostcount++;

        $query = get_posts( array('author' => $user['id'], 'cat' => '3', 'numberposts' => -1, 'post_type'  => 'post' ));
        $avatar = get_avatar($user['id'], $avatar_size);
        $author_profile_url = get_author_posts_url($user['id']);
        $profile = get_userdata($user['id']);

        // update the rank for each user
        update_user_meta( $user['id'], 'user_rank', $rank );

        if (count($query)) {

        echo '<div class="rankpostcount-'.$rankpostcount.' single-item-9">';

        echo '<div class="members-name-9"><a href="', $author_profile_url, '">' . $profile->first_name .'</a><div class="author-rank-9" title="Artist Rank">'.$rank.'</div></div>';

        echo '</div>';         
        }
    }

    echo '</div>';

    die();
}

add_action('wp_ajax_loadMore', 'loadMore');
add_action('wp_ajax_nopriv_loadMore', 'loadMore');

load-more-users.js

jQuery(document).ready(function($) {

        jQuery("#load-more-rank-list").on("click",function(){ // When btn is pressed.
        jQuery("#load-more-rank-list").attr("disabled",true); // Disable the button, temp.
        load_posts();
        });
        var ppp = 10; // Post per page
        var pageNumber = 1; 

        function load_posts() {

        pageNumber++;
        var str = '&pageNumber=' + pageNumber + '&ppp=' + ppp + '&action=loadMore';
        $(".loader").html("<img src='<?php echo get_template_directory_uri(); ?>/images/loading.gif'>");
        jQuery.ajax({
            type: "POST",
            dataType: "html",
            url: "<?php echo site_url(); ?>/wp-admin/admin-ajax.php",
            data: str,
            success: function(data){
                var $data = $(data);
                if($data.length){
                    $("#top-artists-contributors").append($data);
                    $(".loader").html("");
                } else{
                    $("#load-more-rank-list").addClass('hide-more-btn');
                    $(".no-more-post").html("No More Post");
                    $(".loader").html("");

                }
            },
            error : function(jqXHR, textStatus, errorThrown) {
                $loader.html(jqXHR + " :: " + textStatus + " :: " + errorThrown);
            }
        });
        return false;
        }
});

来源:https://stackoverflow.com/questions/54382109/wordpress-top-authors-list-by-highest-post-views-with-ajax-pagination

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!