Как добавить пагинацию к циклу записей в пользовательской вкладке BuddyPress

Вопрос или проблема

Я создал новую вкладку под названием “Видео” на странице профиля 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() ? __( '&larr; Предыдущий ', 'mars' ) : __( ' &rarr; Предыдущий', 'mars' ),

        'next_text' => !is_rtl() ? __( 'Далее &rarr;', 'mars' ) : __( 'Далее &larr;', 'mars' )

    ) );

return $links;

}

.

Ответ или решение

Для добавления пагинации к циклу постов на пользовательской вкладке BuddyPress, в первую очередь, необходимо правильно настроить параметры запроса и убедиться, что URL-структура для пагинации формируется корректно. В вашем случае, у вас возникла проблема с тем, что переход на следующую страницу приводит к ошибке 404, несмотря на то, что вручную введенный URL работает корректно.

Шаги для решения проблемы:

  1. Убедитесь, что углы запроса настроены правильно:
    Вам нужно добавить параметр 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);
  2. Использование правильной структуры 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;
    }
  3. Вывод Пагинации:
    Вы должны убедиться, что пагинация выводится после цикла 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;
  4. Проверка ЧПУ и Редиректов:
    Убедитесь, что правила перезаписи (rewrite rules) для вашего кастомного типа записей включены. В WordPress это можно сделать, обновив постоянные ссылки в области настроек (Settings → Permalinks). Это гарантирует, что ваши пользовательские URL не будут возвращать ошибку 404.

Итог: Настройка пагинации для пользовательского типа постов в BuddyPress потребует внимания к деталям, особенно в отношении правильного получения параметров запроса и формулировки URL в соответствии с вашими требованиями. Эти шаги помогут вам решить проблему, и вы сможете завершить создание функционала на вкладке "Видео".

Оцените материал
Добавить комментарий

Капча загружается...