Intereting Posts
Как вставить содержимое разных полей MySQL в сообщение? Как отредактировать / удалить термин, который находится в нескольких таксономии? Как вы создаете блог WordPress с несколькими авторами, чтобы позволить что-то вроде «вики-страницы» в StackExchange? Активация нового зарегистрированного сайта выходит из строя на многоузловом Редактирование таблиц mysql / базы данных с помощью wordpress или другого приложения / cms Как добавить правило перезаписи для указания файла Загрузка динамического содержимого с помощью AJAX-разрыва jQuery Загрузка изображения с внешнего интерфейса с помощью иконок Lose «Архив блога» из заголовка страницы Как переместить многострочный WordPress? Лучшая коллекция кода для вашего .htaccess файла Написание PHP-кода на страницах без проблем? Как заказать список таксономий? Сортировать по? почему wp_register_script не работает для register_activation_hook Переписать правила приоритета

WP_Query и разбиение на страницы на первой странице

Последние два дня я пытался отладить проблему с WP_Query() и Pagination.

Веб-сайт, на котором я являюсь разработчиком, использует тему WordPress (Salient by ThemeNectar), которая включает в себя плагин визуального композитора. Моя работа заключается в том, чтобы убедиться, что сайт просто функциональный, поэтому некоторое время назад я написал расширение для визуального композитора. Это расширение использует WP_Query() для создания нового запроса, ищет сообщения в определенных категориях (с установленным по умолчанию), а затем возвращает результат этого запроса

Вот код, который отображает сообщения и разбиение на страницы внутри этого компонента визуального композитора

 public function renderPosts( $atts, $content = null ) { global $post; setup_postdata($post); extract( shortcode_atts( array( 'foo' => 5, //default of 5 'categoryslug' => 'news-views' // Currently news and views. ), $atts) ); // For getting the Query variable on a statcci front page, you have // to use 'page' and not 'paged'. Weird. $paged = ( get_query_var('page') ) ? get_query_var('page') : 1; // Two things needed: Not using the game library, // Definitely using the supplied slug. // These are two objects. $dontUse = get_category_by_slug('game-library'); $catUsed = get_category_by_slug($atts->categoryslug); // Args for the custom query $query_args = array( 'posts_per_page' => intval($foo), 'category__not_in' => $dontUse->term_id, 'cat' => $catUsed->term_id, 'page' => $paged ); $custom_query = new WP_Query($query_args); $output = '<div id="blogroll">'; while ( $custom_query->have_posts() ) : $custom_query->the_post(); $output .= "<div class='home_post col span_12 clear-both'>"; $output .= "<div class='col span_3'><a href='" . get_the_permalink() . "'>" . get_the_post_thumbnail(get_the_ID(), 'home_post_thumb') . "</a></div>"; $output .= "<div class='col span_9 col_last right-edge'>"; $output .= "<h2 class='home_post_header'>"; $output .= '<a href="' . get_the_permalink() . '">' . get_the_title() . "</a>"; $output .= "</h2>"; $output .= get_the_excerpt(); $output .= '<a class="home-more-link" href="' . get_the_permalink() . '"><span class="continue-reading">Read More</span></a>'; $output .= "</div>"; $output .= "</div>"; endwhile; wp_reset_postdata(); // Pagination not working, but it outputs just fine? $output .= '<div id="pagination" class="blogroll-pagination">' . home_pagination($custom_query) . '</div></div>'; wp_reset_query(); return $output; } 

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

Вот функция, которую я создал, называется home_pagination(query)

 function home_pagination($query = null) { /*if ( !$query ) { global $wp_query; $query = $wp_query; } commented out because do I need this? */ $big = 999999999; // need an unlikely integer $pagination = paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => max( 1, get_query_var( 'page' ) ), 'total' => $query->max_num_pages, 'prev_text' => '&laquo; Previous', 'next_text' => 'Next &raquo;', ) ); return $pagination; } 

Теперь это работает не неделю назад, но я не могу заставить его работать сейчас … Вот что я пробовал:

  1. Играя с get_query_var('page')
  2. Использование плагина (Wp_page_navi)
  3. Изменение где и когда используются wp_reset_postdata() и wp_reset_query()
  4. Использование max_num_pages пути max_num_pages для next_posts_link() и previous_posts_link()

Это на статической первой странице, и я знаю, что правила отличаются от «page» и «paged»,

Интересно отметить : когда я изменяю переменную «paged» в аргументах запроса, она возвращает соответствующую соответствующую страницу.

Я пытаюсь понять, почему разбиение на страницы, которое я выводил как часть этого запроса, делает абсолютно БЕСПЛАТНО, когда я пытаюсь ориентироваться с ним? Это похоже на то, что он хочет перейти к / page / 2 или любому номеру, но затем сразу же перенаправляется на сам сайт …

Я рассматриваю возможность не paginate_links() вызов paginate_links() в отдельную функцию. Вероятно, есть вопиющие ошибки, но я искалечил разбиение на страницы, которые больше не работают. Любые идеи о том, как я могу наилучшим образом подойти к этому? Есть что-то огромное, что мне не хватает?

Solutions Collecting From Web of "WP_Query и разбиение на страницы на первой странице"

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

  • SoC -> Из вашего кода я обнаружил, что вы используете короткий код, который должен иметь свой отдельный класс. Вы не должны расширять класс до визуального редактора ( по крайней мере, так я читаю ваш вопрос ). Классы никогда не должны выполнять много задач, они должны выполнять один долг. Это позволяет вашему классу быть способным, коротким, легким в обслуживании и многоразовым и легко тестируемым

  • Расширение предыдущей точки, функциональность переднего и заднего конца не должна смешиваться

  • Я не вижу полезности использования global $post и создания почтовых данных. Выполнение этого и не сброс postdata впоследствии будет иметь неожиданные влияния на любой запрос впоследствии и на основной запрос. Вы должны полностью отказаться от этого

  • Никогда не используйте extract() в коротких кодах (и любую другую функцию, если на то пошло). Это очень нереалистично и неустойчиво и приводит к неожиданному результату. Это делает его чрезвычайно трудным для отладки в случае сбоев. По этой причине он был полностью удален из ядра. См. Билет на трафик 22400

  • Поскольку вы используете несколько условий категории и чтобы сделать ее более динамичной, я бы скорее использовал tax_query для обработки условий. Большим плюсом здесь будет то, что вы сэкономите на вызовах db, так как вы можете избавиться от get_category_by_slug

  • Нет необходимости в wp_reset_query() . Это используется с query_posts которые вы никогда не должны использовать. Это прерыватель страниц.

  • get_query_var( 'page' ) страницами и отдельными страницами используется страница переменных запроса ( get_query_var( 'page' ) ) для разбивки на страницы и не paged ( get_query_var( 'paged' ) ) как другие страницы. Аргумент запроса для WP_Query для обоих, однако, тот же, он должен быть paged , а не page . Значение для paged параметра / аргумента должно быть page для статических передних страниц и paged для всех других страниц

Вы можете переписать свой метод выше: ( CAVEAT: Untested )

 public function renderPosts( $atts ) { $attributes = shortcode_atts( array( 'foo' => 5, //default of 5 'include' => 'news-views', // Currently news and views. 'exclude' => 'game-library' // Exclude this category ), $atts); /* * For getting the Query variable on a static front page, you have * to use 'page' and not 'paged'. Weird. */ if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } /* * Args for the custom query */ $query_args = array( 'posts_per_page' => intval($attributes['foo']), 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => explode( ',', str_replace( ' ', '', $attributes['include'] ) ), 'include_children' => false ), array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => explode( ',', str_replace( ' ', '', $attributes['exclude'] ) ), 'operator' => 'NOT IN' ) ), 'paged' => $paged ); $custom_query = new WP_Query($query_args); $output = ''; if ( $custom_query->have_posts() ) { $output .= '<div id="blogroll">'; while ( $custom_query->have_posts() ) { $custom_query->the_post(); $output .= "<div class='home_post col span_12 clear-both'>"; $output .= "<div class='col span_3'><a href='" . get_the_permalink() . "'>" . get_the_post_thumbnail(get_the_ID(), 'home_post_thumb') . "</a></div>"; $output .= "<div class='col span_9 col_last right-edge'>"; $output .= "<h2 class='home_post_header'>"; $output .= '<a href="' . get_the_permalink() . '">' . get_the_title() . "</a>"; $output .= "</h2>"; $output .= get_the_excerpt(); $output .= '<a class="home-more-link" href="' . get_the_permalink() . '"><span class="continue-reading">Read More</span></a>'; $output .= "</div>"; $output .= "</div>"; } wp_reset_postdata(); $output .= '<div id="pagination" class="blogroll-pagination">' . home_pagination( $custom_query ) . '</div></div>'; } return $output; } 

Просто помните, что я изменил атрибуты для удобочитаемости, include себя разделенную запятыми строку категорий slugs ( include='slug-1, slug-2' ). Этот атрибут будет использоваться для включения категорий. exclude работает одинаково ( exclude='slug-1, slug-2' ), за исключением того, что он принимает разделенную запятыми строку категорий slugs

РЕДАКТИРОВАТЬ

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

ДОКАЗАТЕЛЬСТВО КОНЦЕПЦИИ – КРАТКИЙ КОД

 add_shortcode( 'testcode', function ( $atts ) { $attributes = shortcode_atts( array( 'foo' => 5, //default of 5 'include' => 'news-views', // Currently news and views. 'exclude' => 'game-library' // Exclude this category ), $atts); /* * For getting the Query variable on a static front page, you have * to use 'page' and not 'paged'. Weird. */ if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } /* * Args for the custom query */ $query_args = array( 'posts_per_page' => intval($attributes['foo']), 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => explode( ',', str_replace( ' ', '', $attributes['include'] ) ), 'include_children' => false ), array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => explode( ',', str_replace( ' ', '', $attributes['exclude'] ) ), 'operator' => 'NOT IN' ) ), 'paged' => $paged ); $custom_query = new WP_Query($query_args); $output = ''; if ( $custom_query->have_posts() ) { $output .= '<div id="blogroll">'; while ( $custom_query->have_posts() ) { $custom_query->the_post(); $output .= "<div class='home_post col span_12 clear-both'>"; $output .= "<div class='col span_3'><a href='" . get_the_permalink() . "'>" . get_the_post_thumbnail(get_the_ID(), 'home_post_thumb') . "</a></div>"; $output .= "<div class='col span_9 col_last right-edge'>"; $output .= "<h2 class='home_post_header'>"; $output .= '<a href="' . get_the_permalink() . '">' . get_the_title() . "</a>"; $output .= "</h2>"; $output .= get_the_excerpt(); $output .= '<a class="home-more-link" href="' . get_the_permalink() . '"><span class="continue-reading">Read More</span></a>'; $output .= "</div>"; $output .= "</div>"; } wp_reset_postdata(); $output .= '<div id="pagination" class="blogroll-pagination">' . home_pagination( $custom_query ) . '</div></div>'; } return $output; }); 

которые я использую следующим образом

 [testcode include='testslug-1, testslug-2' exclude='testslug-3, testslug-4'] 

Я также проверил вашу функцию разбивки на страницы, а также работает так, как ожидалось.

 function home_pagination( $query = null ) { $big = 999999999; // need an unlikely integer if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } $pagination = paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => $paged, 'total' => $query->max_num_pages, 'prev_text' => '&laquo; Previous', 'next_text' => 'Next &raquo;', ) ); return $pagination; } 

EDIT 2

Frm ваши комментарии, и, как я уже сказал, статические передние страницы и отдельные страницы используют get_query_var( 'page' ) для разбивки на страницы, а все остальные используют get_query_var( 'paged' ) . Я обновил весь код выше со следующим

 if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } 

Это приведет к сортировке проблемы со page и paged page а также сделает ваш короткий код и разбивку на страницы на всех страницах без каких-либо конкретных изменений

ИЗМЕНИТЬ 3

Вот слабая модифицированная версия кода от @ChipBennet, которая будет сортировать проблему /page/2

 function home_pagination( $query = null ) { global $wp_rewrite; if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } $pagination = array( 'base' => @add_query_arg( 'paged', '%#%' ), 'format' => '', 'current' => $paged, 'total' => $query->max_num_pages, 'prev_text' => '&laquo; Previous', 'next_text' => 'Next &raquo;', ); if ( $wp_rewrite->using_permalinks() ) $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ).'/%#%/', '' ); if ( ! empty( $wp_query->query_vars['s'] ) ) $pagination['add_args'] = array( 's' => get_query_var( 's' ) ); return paginate_links( $pagination ); } 

Согласно коду

Если разбиение на страницы разбито на статической главной странице, вам необходимо добавить параметр «paged» следующим образом:

 if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } query_posts('posts_per_page=3&paged=' . $paged); 

Параметр страницы изменен на Paged, обновите функциональный код следующим образом

 public function renderPosts( $atts, $content = null ) { global $post; setup_postdata($post); extract( shortcode_atts( array( 'foo' => 5, //default of 5 'categoryslug' => 'news-views' // Currently news and views. ), $atts) ); // For getting the Query variable on a statcci front page, you have // to use 'page' and not 'paged'. Weird. $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; // Two things needed: Not using the game library, // Definitely using the supplied slug. // These are two objects. $dontUse = get_category_by_slug('game-library'); $catUsed = get_category_by_slug($atts->categoryslug); // Args for the custom query $query_args = array( 'posts_per_page' => intval($foo), 'category__not_in' => $dontUse->term_id, 'cat' => $catUsed->term_id, 'paged' => $paged ); $custom_query = new WP_Query($query_args); $output = '<div id="blogroll">'; while ( $custom_query->have_posts() ) : $custom_query->the_post(); $output .= "<div class='home_post col span_12 clear-both'>"; $output .= "<div class='col span_3'><a href='" . get_the_permalink() . "'>" . get_the_post_thumbnail(get_the_ID(), 'home_post_thumb') . "</a></div>"; $output .= "<div class='col span_9 col_last right-edge'>"; $output .= "<h2 class='home_post_header'>"; $output .= '<a href="' . get_the_permalink() . '">' . get_the_title() . "</a>"; $output .= "</h2>"; $output .= get_the_excerpt(); $output .= '<a class="home-more-link" href="' . get_the_permalink() . '"><span class="continue-reading">Read More</span></a>'; $output .= "</div>"; $output .= "</div>"; endwhile; wp_reset_postdata(); // Pagination not working, but it outputs just fine? $output .= '<div id="pagination" class="blogroll-pagination">' . home_pagination($custom_query) . '</div></div>'; wp_reset_query(); return $output; } 

Ну, если мне нужно использовать Pagination, я поеду с плагином WP-PageNavi .

 $paged = get_query_var('paged') ? get_query_var('paged') : 1; $args = array('post_type' => 'post', 'posts_per_page' => 5, 'paged' => $paged); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); // Your Custom Loop Code Here endwhile; ?> <?php wp_pagenavi( array( 'query' => $loop ) ); ?> 

WP-PageNavi будет отображать разбиение на страницы по вашему запросу.