Вопрос или проблема
Я создал новую вкладку под названием “Видео” на странице профиля BuddyPress. Эта вкладка содержит все видеозаписи, добавленные этим пользователем. Проблема в том, что она показывает только первые 12 записей, и пагинация не отображается. Я попытался включить код пагинации, предоставленный темой, но безрезультатно.
Заметки:
-
Я использую тему под названием “VideoTube”
-
Цикл постов, для которого нужна пагинация, относится к пользовательскому типу записи “video”
-
Оригинальный код пагинации, предоставленный темой, выглядит так:
<?php do_action( 'mars_pagination', null );?>
-
Код ниже взят из моего файла functions.php в папке дочерней темы.
Спасибо заранее за всю вашу помощь 😀
Код:
<?php function my_videos_screen_content() {
?>
<div class="container">
<div class="row">
<div class="col-sm-8">
<div class="row video-section meta-maxwidth-230">
<?php
$args = array(
'post_type' => array( 'video' ),
'author' => bp_displayed_user_id(),
'posts_per_page' => get_option( 'posts_per_page' )
);
$author_videos = new WP_Query( $args );
if ( $author_videos->have_posts() ) : while ( $author_videos->have_posts() ) : $author_videos->the_post();
get_template_part( 'loop', 'video' );
endwhile; ?>
</div>
<?php do_action( 'mars_pagination', null );?>
<?php wp_reset_postdata();
endif; ?>
</div>
</div>
</div>
</div>
<?php }
Итак, я разобрался, как показать пагинацию, с помощью следующего кода. Проблема в том, что когда я нажимаю на следующую страницу, она переходит на страницу 404. Но когда я вручную посещаю пользовательский URL, она корректно отображает вторую страницу, вот два примера:
Версия 404:
Это структура URL, которая генерируется этим кодом пагинации
www.website.com/members/username/my-videos/page/2/
Рабочая версия:
Это ручной URL, который я нашел, работающим
www.website.com/members/username/my-videos/?page=2
Вопрос в том, как сделать так, чтобы это работало с первой версией (/page/2/)
КОД:
<?php function my_videos_screen_content() {
echo 'Мы в настоящее время работаем над этим разделом, некоторые материалы могут отображаться неправильно. Спасибо за ваше терпение.'; ?>
<div class="container">
<div class="row">
<div class="col-sm-8">
<div class="row video-section meta-maxwidth-230">
<?php
$custom_query_args = array(
'post_type' => 'video',
'author' => bp_displayed_user_id(),
'posts_per_page' => get_option( 'posts_per_page' )
);
$custom_query_args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$custom_query = new WP_Query( $custom_query_args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $custom_query;
if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post();
get_template_part( 'loop', 'video' );
endwhile; ?>
</div>
<?php endif;
wp_reset_postdata(); ?>
<?php // Пагинация пользовательского цикла запросов
previous_posts_link( 'Новые видео' );
next_posts_link( 'Старые видео', $custom_query->max_num_pages );?>
<?php // Сброс объекта основного запроса
$wp_query = NULL;
$wp_query = $temp_query; ?>
</div>
</div><!-- /.row -->
</div>
</div><!-- /.container -->
Это может быть не правильный способ, но это работает на страницах профиля BP
...
$paged = ( isset( $_GET['vp'] ) ) ? $_GET['vp'] : 1;
$args = array(
'post_type' => array( 'video' ),
'author' => bp_displayed_user_id(),
'paged' => $paged,
'posts_per_page' => get_option( 'posts_per_page' )
);
$author_videos = new WP_Query( $args );
if ( $author_videos->have_posts() ) : while ( $author_videos->have_posts() ) : $author_videos->the_post();
get_template_part( 'loop', 'video' );
endwhile; ?>
</div>
<div class="entry-content"><br>
<?php echo videos_profile_pagination( $wp_query ); ?>
</div>
<?php wp_reset_query();
endif; ?>
</div>
</div>
</div>
</div>
<?php }
// пагинация для страницы цикла видео профиля
function videos_profile_pagination( $wp_query ) {
$videos_profile_page_links = paginate_links( array(
'base' => esc_url( add_query_arg( 'vp', '%#%' ) ),
'format' => '',
'total' => ceil( (int) $wp_query->found_posts / (int) get_query_var('posts_per_page') ),
'current' => (int) get_query_var('paged'),
) );
return apply_filters( 'videos_profile_pagination', $videos_profile_page_links );
}
$paged = ( isset( $_GET[‘page’] ) ) ? $_GET[‘page’] : 1;
$custom_query_args = array(
'post_type' => 'video',
'paged' => $paged,
'author' => bp_displayed_user_id(),
'posts_per_page' => get_option( 'posts_per_page' )
);
$custom_query = new WP_Query( $custom_query_args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $custom_query;
if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post();
get_template_part( 'loop', 'video' );
endwhile; ?>
</div>
<ul class="pagination">
<?php
// echo videos_profile_pagination( $wp_query );
$list = videos_profile_pagination($custom_query);
foreach ( $list as $page ) {
echo "<li>$page</li>";
}
?>
</ul>
<?php
add_action('mars_pagination', 'mars_pagination', 10, 1);
wp_reset_query();
endif;
?>
<?php // Сброс объекта основного запроса
$wp_query = NULL;
$wp_query = $temp_query; ?>
</div>
</div><!-- /.row -->
</div>
</div><!-- /.container -->
пагинация для страницы цикла видео профиля
function videos_profile_pagination( $wp_query ) {
$query = $wp_query;
if ( $query->max_num_pages < 2 ) {
return;
}
$paged = ( isset( $_GET['page'] ) ) ? $_GET['page'] : 1;
// Установите пагинированные ссылки.
$links = paginate_links( array(
'base' => '%_%',
'format' => '?page=%#%',
'total' => $query->max_num_pages,
'current' => $paged,
'mid_size' => 3,
'type' => 'array',
'prev_next' => true,
'prev_text' => !is_rtl() ? __( '← Предыдущий ', 'mars' ) : __( ' → Предыдущий', 'mars' ),
'next_text' => !is_rtl() ? __( 'Далее →', 'mars' ) : __( 'Далее ←', 'mars' )
) );
return $links;
}
.
Ответ или решение
Для добавления пагинации к циклу постов на пользовательской вкладке BuddyPress, в первую очередь, необходимо правильно настроить параметры запроса и убедиться, что URL-структура для пагинации формируется корректно. В вашем случае, у вас возникла проблема с тем, что переход на следующую страницу приводит к ошибке 404, несмотря на то, что вручную введенный URL работает корректно.
Шаги для решения проблемы:
-
Убедитесь, что углы запроса настроены правильно:
Вам нужно добавить параметрpaged
к вашим аргументамWP_Query
, чтобы WordPress знал, на какую страницу постов вам нужно перейти. Убедитесь, что ваша переменная$paged
извлекается из URL и используется в аргументах запроса.Пример кода:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; $args = array( 'post_type' => 'video', 'author' => bp_displayed_user_id(), 'posts_per_page' => get_option('posts_per_page'), 'paged' => $paged, ); $author_videos = new WP_Query($args);
-
Использование правильной структуры URL:
Вам нужно настроить структуру комментариев, чтобы она использовалаpage
вместоpaged
. Используя фильтры WordPress, вы можете изменить структуру формирования ссылок на пагинацию. В вашем случае структура ссылок должна быть следующей:'format' => '?page=%#%',
Пример:
function videos_profile_pagination($query) { $links = paginate_links(array( 'base' => esc_url(add_query_arg('page', '%#%')), 'total' => $query->max_num_pages, 'current' => max(1, get_query_var('page')), 'mid_size' => 3, 'prev_text' => __('« Previous', 'text-domain'), 'next_text' => __('Next »', 'text-domain'), 'type' => 'array', )); return $links; }
-
Вывод Пагинации:
Вы должны убедиться, что пагинация выводится после циклаWP_Query
, как в вашем коде. Вот пример того, как это можно сделать:if ($author_videos->have_posts()) : while ($author_videos->have_posts()) : $author_videos->the_post(); get_template_part('loop', 'video'); endwhile; // Выводим пагинацию $pagination = videos_profile_pagination($author_videos); if (is_array($pagination)) { echo '<ul class="pagination">'; foreach ($pagination as $page) { echo "<li>$page</li>"; } echo '</ul>'; } wp_reset_postdata(); endif;
-
Проверка ЧПУ и Редиректов:
Убедитесь, что правила перезаписи (rewrite rules) для вашего кастомного типа записей включены. В WordPress это можно сделать, обновив постоянные ссылки в области настроек (Settings → Permalinks). Это гарантирует, что ваши пользовательские URL не будут возвращать ошибку 404.
Итог: Настройка пагинации для пользовательского типа постов в BuddyPress потребует внимания к деталям, особенно в отношении правильного получения параметров запроса и формулировки URL в соответствии с вашими требованиями. Эти шаги помогут вам решить проблему, и вы сможете завершить создание функционала на вкладке "Видео".