在作者档案中踩下WP_QUERY,以促进与自定义查询的分页
-
16-10-2019 - |
题
我在用 get_posts
和 get_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) 提供一些反馈.. :)
我希望有帮助...