我在用 get_postsget_comments 要在页面上构建几个循环,在该页面上我遇到了一些分页问题。

我有每个页面选项的全局帖子 (设置>阅读) 调成 10, ,这似乎改变了问题。到目前为止,我可以轻松地到达 第2页 - http://dev.ashfame.com/author/ashfame/page/2/, , 但 第3页 返回a 404.

如果我降低了全球价值,我将拥有更多的分页页,但不是全部(比应该有多少个)。

更新: 我只是尝试将自定义设置设置为2(也是全局一个),而WordPress应该分页直到 第4页 (我有 7 要显示的项目),但现在确实如此 第5和6页 给予 404. 。为什么?我现在如何对此问题进行故障排除?

进步: @t31OS帮助我确定了该页面设置分页的页面上的WP默认查询。现在,我可以想到一种杀死该页面上默认WP查询的方法(但是如何?),然后我将如何进一步分页。 作者.php 页?还是还有其他方法?

当前代码:

<?php

            $author_details = $wp_query->get_queried_object();

            // Posts Per Page option
            // $ppp = get_option('posts_per_page');
            $ppp = 1; //custom setting, if you want to obey the global setting here, comment this line and uncomment the above line

            if (!is_paged()) {
                $custom_offset = 0;
            } else {
                $custom_offset = $ppp*($paged-1);
            }

            echo '<h1>Author ID : '.$author_details->ID.', Page : '.$paged.', Custom Offset : '.$custom_offset.'</h1>';

            ?>

            <h2>Articles</h2>

            <?php
            $args = array(
            'numberposts' => $ppp,
            'offset' => $custom_offset,
            'category' => 7,
            'author' => $author_details->ID
            );

            $posts_data = get_posts( $args );

            // print_r($posts_data);

            if ( count( $posts_data ) > 0 ) {               
                echo '<ul>';                
                foreach ( $posts_data as $post ) {                      
                    echo '<li><a href="'.get_permalink( $post->ID ).'">'.$post->post_title.'</a></li>';
                }               
                echo '</ul>';
            } else {
                echo '<p>No articles by this user</p>';
            }           
            ?>

            <h2>Journals</h2>

            <?php
            $args = array(
            'numberposts' => $ppp,
            'offset' => $custom_offset,
            'category' => 6,
            'author' => $author_details->ID
            );
            $posts_data = get_posts( $args );

            // print_r($posts_data);

            if ( count( $posts_data ) > 0 ) {               
                echo '<ul>';                
                foreach ( $posts_data as $post ) {                      
                    echo '<li><a href="'.get_permalink( $post->ID ).'">'.$post->post_title.'</a></li>';
                }               
                echo '</ul>';
            } else {
                echo '<p>No journals by this user</p>';
            }
            ?>

            <h2>Questions</h2>

            <?php
            $args = array(
            'numberposts' => $ppp,
            'offset' => $custom_offset,
            'category' => 3, // parent category ID is enough
            'author' => $author_details->ID
            );
            $posts_data = get_posts( $args );

            // print_r($posts_data);

            if ( count( $posts_data ) > 0 ) {               
                echo '<ul>';                
                foreach ( $posts_data as $post ) {                      
                    $category_array = get_the_category( $post->ID );
                    $category_name = $category_array[0]->name;
                    $category_permalink = get_category_link( $category_array[0]->term_id );
                    echo '<li><a href="'.get_permalink( $post->ID ).'">'.$post->post_title.'</a>
                    <br />In: <a href="'.$category_permalink.'">'.$category_name.'</a><br />'.get_comments_number( $post->ID ).' Answers</li>';
                }               
                echo '</ul>';
            } else {
                echo '<p>No questions by this user</p>';
            }
            ?>

            <h2>Answers</h2>

            <?php
            $args = array(
            'user_id' => $author_details->ID,
            'number' => $ppp,
            'offset' => $custom_offset,
            'status' => 'approve'
            );
            $answers_list = get_comments( $args );

            // print_r($answers_list);

            if ( count( $answers_list ) > 0 ) {
                $date_format = get_option( 'date_format' );
                echo '<ul>';
                foreach ( $answers_list as $answer ) {
                    echo '<li>Answer: '.substr( $answer->comment_content, 0, 20 ).'..<br />'.date( $date_format, strtotime( $answer->comment_date ) ).'<br />Question: <a href="'.get_permalink( $answer->comment_post_ID ).'">'.get_the_title( $answer->comment_post_ID ).'</a></li>';
                }
                echo '</ul>';
            } else {
                echo '<p>No answers by this user</p>';
            }
            ?>
有帮助吗?

解决方案

T31OS说: 有关以前的代码和评论,请参见编辑历史记录

使用ajax打开查询

我整理了一些代码,可以使用Ajax通过简单的PREV/下一个导航通过AJAX获取您的帖子和评论。

1) 替换您在您中发布的所有代码 作者.php 以下..

<?php $cat_settings = array( 'Articles' => 7, 'Journals' => 6, 'Questions' => 3 ); ?>
<?php do_action( 'author_ajax_catposts', $cat_settings ); ?>

2) 在主题目录中创建一个JavaScript文件称为 authorposts.js 并将以下代码放入该文件中。

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

    if( 'undefined' == typeof( aacVars ) )
        return;

    $('.aacnav').click(function() {

        var r = $( $(this).attr('href') );
        var a = $( $(this).attr('href') + '-ap' );
        var c = this.className.split(' ');

        if( 
            'undefined' == typeof( c ) || 
            'undefined' == typeof( r ) || 
            'undefined' == typeof( a ) 
        )
            return false;

        var d = { 
            action:      aacVars.posts_action, 
            _ajax_nonce: aacVars.nonce,
            author:      aacVars.author,
            category:    $(this).attr('href')
        };

        p = parseInt( a.text() );
        c = c.pop();

        switch( c ) {
            case 'aacnext':
                if( r.children('p.nomore').length )
                    return false;
                d.page = p + 1;
            break;
            case 'aacprev':
                if( p < 2 )
                    return false;
                d.page = p - 1;
            break;
            default:
                return false;
        }

        $.post( aacVars.ajaxpth, d, function( res ) {
            if( '-1' == res ) {
                alert( 'auth failed' );
                return false;
            }
            $( r ).html( res );
            $( a ).text( d.page );
        });

        return false;
    });

    $('.aacnavc').click(function() {

        var r = $( '#aac-comments' );
        var n = $( '#aac-comments-ap' );
        var l = $(this).attr('href');

        if( 
            'undefined' == typeof( n ) || 
            'undefined' == typeof( r ) 
        )
            return false;

        var d = { 
            action:      aacVars.comments_action, 
            _ajax_nonce: aacVars.nonce,
            author:      aacVars.author
        };

        p = parseInt( n.text() );

        switch( l ) {
            case '#next':
                if( r.children('p.nomore').length )
                    return false;
                d.page = p + 1;
            break;
            case '#prev':
                if( p < 2 )
                    return false;
                d.page = p - 1;
            break;
            default:
                return false;
        }

        $.post( aacVars.ajaxpth, d, function( res ) {
            if( '-1' == res ) {
                alert( 'auth failed' );
                return false;
            }
            r.html( res );
            $( n ).text( d.page );
        });

    });

});

3) 将以下代码复制到您的主题中 functions.php 文件。

class Author_Ajax_Cats {

    private $posts_per_page    = 3;
    private $comments_per_page = 1;
    private $posts_action      = 'aac-posts';
    private $comments_action   = 'aac-comments';
    private $js                = array();

    public function __construct() {

        add_action( 'parse_request',                            array( $this, 'aac_parse_request' ) );
        add_action( 'wp_ajax_nopriv_' . $this->posts_action,    array( $this, 'aac_ajax_posts' ) );
        add_action( 'wp_ajax_' .        $this->posts_action,    array( $this, 'aac_ajax_posts' ) );
        add_action( 'wp_ajax_nopriv_' . $this->comments_action, array( $this, 'aac_ajax_comments' ) );
        add_action( 'wp_ajax_' .        $this->comments_action, array( $this, 'aac_ajax_comments' ) );
        add_action( 'wp_enqueue_scripts',                       array( $this, 'aac_enqueue_scripts' ) );
        add_action( 'author_ajax_catposts',                     array( $this, 'aac_print_posts' ) );
    }
    public function aac_parse_request( $wp ) {

        if( !isset( $wp->query_vars['author_name'] ) || is_admin() )
            return;

        $wp->query_vars['paged'] = 1;

    }
    private function setup_js_vars() {

        global $wp_query;

        $this->js['author']          = $wp_query->get_queried_object_id();
        $this->js['posts_action']    = $this->posts_action;
        $this->js['comments_action'] = $this->comments_action;
        $this->js['nonce']           = wp_create_nonce( 'noncekey' );
        $this->js['ajaxpth']         = admin_url( 'admin-ajax.php' );
    }
    public function aac_enqueue_scripts() {

        if( !is_author() )
            return;

        $this->setup_js_vars();

        wp_register_script( 'author-ajax', get_bloginfo('stylesheet_directory') . '/authorposts.js', array( 'jquery' ), time(), true );
        wp_localize_script( 'author-ajax', 'aacVars', $this->js );
        wp_enqueue_script( 'author-ajax' );
    }
    public function aac_ajax_comments() {

        if( !isset( $_POST['page'] ) || !isset( $_POST['author'] ) )
            die;

        check_ajax_referer( 'noncekey' );

        $authID = absint( $_POST['author'] );
        $paged  = absint( $_POST['page'] );

        $args = array(
            'user_id' => $authID,
            'number'  => $this->comments_per_page,
            'offset'  => ( ( $paged - 1 ) * $this->comments_per_page ),
            'status'  => 'approve',
            'type'    => 'comment'
        );

        $answers_list = get_comments( $args );
        if( empty( $answers_list ) ) {
            printf( '<p class="nomore">%s</p>', __( 'No more answers by this user.' ) );
            die;
        }
        $_comment_walk = new Walker_Comment;

        echo '<ul>';
        $_comment_walk->paged_walk( $answers_list, 0, 1, $this->comments_per_page, array( 
            'style' => 'ul', 
            'avatar_size' => 15, 
            'max_depth' => 1, 
            'callback' => array( $this, 'author_comment_walker' ) 
        ) );
        echo '</ul>';

        die;
    }
    public function aac_ajax_posts() {

        if( !isset( $_POST['page'] ) || !isset( $_POST['category'] ) || !isset( $_POST['author'] ) )
            die;

        check_ajax_referer( 'noncekey' );

        $catID  = absint( str_replace( '#aac-', '', $_POST['category'] ) );
        $authID = absint( $_POST['author'] );
        $paged  = absint( $_POST['page'] );

        $args = array(
            'paged'       => $paged,
            'numberposts' => $this->posts_per_page,
            'author'      => $authID,
            'cat'         => $catID
        );
        $posts = get_posts( $args );

        if( empty( $posts ) )
            die( sprintf( '<p class="nomore">%s</p>', __( 'No more posts.' ) ) );

        $this->do_posts( $posts );

        die;
    }
    public function aac_print_posts( $cats = array() ) {

        //get_the_term_list( $post->ID, 'category', '<ul><li>', '</li><li>', '</li></ul>' )

        foreach( $cats as $heading => $id ) {
            $args = array( 
                'cat'         => $id,
                'paged'       => 1, // Always the first page on load
                'numberposts' => $this->posts_per_page, 
                'author'      => $this->js['author']
            );
            $posts = get_posts( $args );

            printf( '<h2>%s</h2>', $heading );

            if( empty( $posts ) ) {
                printf( '<div><p class="nomore">%s</p></div>', __( 'No posts.' ) );
                continue;
            }

            printf( '<div id="aac-%d" class="aac-result">', $id );

            $this->do_posts( $posts );

            printf( '</div><div>' );
            printf( '<p class="alignright">Page: <span id="aac-%1$d-ap">1</span></p><p class="alignleft"><a class="aacnav aacprev" href="#aac-%1$d">%2$s</a> <a class="aacnav aacnext" href="#aac-%1$d">%3$s</a></p>', $id, __('Previous'), __('Next') );
            printf( '<br class="clear" /></div>' );
        }
        ?>

        <h2>Answers</h2>

        <?php
        $args = array(
            'user_id' => $this->js['author'],
            'number'  => $this->comments_per_page,
            'status'  => 'approve',
            'type'    => 'comment'
        );
        $answers_list = get_comments( $args );
        if( empty( $answers_list ) ){
            printf( '<p>%s</p>', __( 'No answers by this user' ) );
            return;
        }
        $_comment_walk = new Walker_Comment;

        printf( '<div id="aac-comments"><ul>' );

        $_comment_walk->paged_walk( $answers_list, 0, 1, $this->comments_per_page, array( 
            'style' => 'ul', 
            'avatar_size' => 15, 
            'max_depth' => 1, 
            'callback' => array( $this, 'author_comment_walker' ) 
        ) );

        printf( '</ul></div><div><p class="alignright">Page: <span id="aac-comments-ap">1</span></p><p class="alignleft"><a class="aacnavc" href="#prev">%s</a> <a class="aacnavc" href="#next">%s</a></p><br class="clear" /></div>', __('Prev'), __('Next') );
    }
    private function do_posts( $posts, $term_id = 0 ) {

        echo '<ul>';
        foreach( $posts as $post )
            printf( '<li><a href="%s">%s</a></li>', get_permalink( $post->ID ), get_the_title( $post->ID ) );
        echo '</ul>';

    }
    public function author_comment_walker( $comment, $args, $depth ) {

        $GLOBALS['comment'] = $comment; 
        ?>

        <li>
            <div id="comment-<?php comment_ID(); ?>">
                <div>
                    <?php echo get_avatar( $comment, $args['avatar_size'], $default = '<path_to_url>' ); ?> <?php echo get_comment_author_link(); ?> answered 
                    <a href="<?php echo get_permalink( $comment->comment_post_ID ); ?>"><?php echo get_the_title( $comment->comment_post_ID ); ?></a> on <a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf( __( '%1$s at %2$s' ), get_comment_date(),  get_comment_time() ); ?></a>
                    <?php //edit_comment_link( __( '(Edit)' ),'  ','' ); ?>
                </div>
                <?php // comment_text() ?>
                <p><?php comment_excerpt(); ?></p>
            </div>
        <?php
    }
}
$aac = new Author_Ajax_Cats;

4) 启动作者页面,查看结果的外观,并检查我的代码适合您。

使用测试数据在本地外观。

单击查看较大版本,缩小答案

行动中代码的实时演示:**(测试站点)

http://t31os.onatha.com/author/t31os/

5) 提供一些反馈.. :)

我希望有帮助...

许可以下: CC-BY-SA归因
scroll top