Intereting Posts
Плагин: подключение классов, у которых есть свои собственные крючки добавить фильтр в wp_list_categories и запрос, если он используется для перечисления налоговых терминов? Кэш баз данных и разница в кеше объектов? Пользовательские размеры изображений добавляют к метаданным Динамически создавать / удалять термины в таксономии, когда публикуется / сортируется пользовательский тип публикации Руководство с петлей для CMS Недостающее изображение при вставке ссылки в Facebook, несмотря на правильный метатег og: image Измените URL-адрес ссылки в RSS-каналах по умолчанию Страница отображает архивы блога plugins_url () работает везде, но wp_reqister_script () в настройке сети у супер администратора есть кнопки tinyMCE, а у обычного администратора нет Как сеть активируется в зависимости от активации (путем внедрения)? Как настроить область рабочей области / администратора в настраиваемом типе сообщений без плагинов? Подстраницы WordPress для пользовательских типов сообщений Как создать динамическое значение в WP_Query meta_query

Stomping WP_Query в архиве автора для облегчения разбивки на страницы с пользовательскими запросами

Я использую get_posts и get_comments для создания нескольких циклов на странице, в которых у меня возникают некоторые проблемы в разбивке на страницы.

У меня есть параметр глобальных сообщений на странице (Настройки> Чтение), установленный в 10 , и это, похоже, меняет проблему. На данный момент я могу легко добраться до страницы 2 – http://dev.ashfame.com/author/ashfame/page/2/ , но вернет 404 .

Если я снижу глобальное значение, у меня будет больше страниц с разбивкой по страницам, но не все (меньшее число, чем должно быть).

Обновление: я просто попробовал установить свой пользовательский параметр как 2 (и глобальный), а WordPress должен разбиваться до страницы 4 (у меня есть 7 элементов для показа), но теперь он делает это, а также страницы 5 и 6. 7 дает 404 . Зачем? Как устранить эту проблему сейчас?

Прогресс: @ t31os помог мне понять, что его запрос по умолчанию WP на странице, который настраивает разбиение на страницы для этой страницы. Теперь я могу подумать об одном способе убить запрос WP по умолчанию на этой странице (но как?), А затем, как бы я дальше разбивать страницу author.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>'; } ?> 

Solutions Collecting From Web of "Stomping WP_Query в архиве автора для облегчения разбивки на страницы с пользовательскими запросами"

t31os говорит: [См. историю изменений для предыдущего кода и комментариев]

Использование Ajax для разбивки ваших запросов

Я собрал код, который будет извлекать ваши сообщения и комментарии через ajax, используя простую предважную / следующую навигацию через ajax.

1) Замените весь код, который вы опубликовали в вашем author.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) Предоставьте некоторую обратную связь .. 🙂

Надеюсь, это поможет…