@Qumbeez

Вывод пагинации на custom types wordpress?

Доброго времени суток. Вопрос в том, как вывести пагинацию на странице example.com/shop где отображаются с помощью <?php $product = new WP_Query(array('post_type' => 'product', 'posts_per_page' => 12)); ?> Мои продукты. Для блога есть функция wp_pagenavi которую я переделал с этой страницы wp-kama.ru/id_8/alternativa-wp-pagenavi-bez-lishni... . Но она не работает для страницы shop. Только для news.

Вот функция wp_pagenavi()
function wp_pagenavi($before = '', $after = '', $echo = true, $types = '', $args = array())
{
    global $wp_query;

    // параметры по умолчанию
    $default_args = array(
        'text_num_page'   => '', // Текст перед пагинацией. {current} - текущая; {last} - последняя (пр. 'Страница {current} из {last}' получим: "Страница 4 из 60" )
        'num_pages'       => 10, // сколько ссылок показывать
        'step_link'       => 10, // ссылки с шагом (значение - число, размер шага (пр. 1,2,3...10,20,30). Ставим 0, если такие ссылки не нужны.
        'dotright_text'   => '…', // промежуточный текст "до".
        'dotright_text2'  => '…', // промежуточный текст "после".
        'back_text'       => '<i class="fa fa-angle-left v-middle"></i>', // текст "перейти на предыдущую страницу". Ставим 0, если эта ссылка не нужна.
        'next_text'       => '<i class="fa fa-angle-right v-middle"></i>', // текст "перейти на следующую страницу". Ставим 0, если эта ссылка не нужна.
        'first_page_text' => '0', // текст "к первой странице". Ставим 0, если вместо текста нужно показать номер страницы.
        'last_page_text'  => '0', // текст "к последней странице". Ставим 0, если вместо текста нужно показать номер страницы.
    );
    
    $args = array_merge( $default_args, $args );
    
    extract( $args );

    $posts_per_page = (int) $wp_query->query_vars['posts_per_page'];
    $paged          = (int) $wp_query->query_vars['paged'];
    $max_page       = $wp_query->max_num_pages;

    //проверка на надобность в навигации
    if( $max_page <= 1 )
        return false; 

    if( empty( $paged ) || $paged == 0 ) 
        $paged = 1;

    $pages_to_show = intval( $num_pages );
    $pages_to_show_minus_1 = $pages_to_show-1;

    $half_page_start = floor( $pages_to_show_minus_1/2 ); //сколько ссылок до текущей страницы
    $half_page_end = ceil( $pages_to_show_minus_1/2 ); //сколько ссылок после текущей страницы

    $start_page = $paged - $half_page_start; //первая страница
    $end_page = $paged + $half_page_end; //последняя страница (условно)

    if( $start_page <= 0 ) 
        $start_page = 1;
    if( ($end_page - $start_page) != $pages_to_show_minus_1 ) 
        $end_page = $start_page + $pages_to_show_minus_1;
    if( $end_page > $max_page ) {
        $start_page = $max_page - $pages_to_show_minus_1;
        $end_page = (int) $max_page;
    }

    if( $start_page <= 0 ) 
        $start_page = 1;

    //выводим навигацию
    $out = '';

    // создаем базу чтобы вызвать get_pagenum_link один раз
    $link_base = get_pagenum_link( 99999999 ); // 99999999 будет заменено
    $link_base = str_replace( 99999999, '___', $link_base);
    $first_url = user_trailingslashit( get_pagenum_link( 1 ) );
    $out .= $before . "<ul>\n";

    if( $text_num_page ){
        $text_num_page = preg_replace( '!{current}|{last}!', '%s', $text_num_page );
        $out.= sprintf( " <li class='current'><a>$text_num_page</a></li> ", $paged, $max_page );
    }
    // назад
    if ( $back_text && $paged != 1 ) 
        $out .= '<li><a class="previous i-previous" href="'. str_replace( '___', ($paged-1), $link_base ) .'">'. $back_text .'</a></li>';
    // в начало
    if ( $start_page >= 2 && $pages_to_show < $max_page ) {
        $out.= '<li><a href="'. $first_url .'">'. ( $first_page_text ? $first_page_text : 1 ) .'</a></li>';
        if( $dotright_text && $start_page != 2 ) $out .= '<li><a>'. $dotright_text .'</a></li>';
    }
    // пагинация
    for( $i = $start_page; $i <= $end_page; $i++ ) {
        if( $i == $paged )
            $out .= '<li class="current"><a>'.$i.'</a></li>';
        elseif( $i == 1 )
            $out .= '<li><a href="'. $first_url .'">1</a></li>';
        else
            $out .= '<li><a href="'. str_replace( '___', $i, $link_base ) .'">'. $i .'</a></li>';
    }

    //ссылки с шагом
    $dd = 0;
    if ( $step_link && $end_page < $max_page ){
        for( $i = $end_page+1; $i<=$max_page; $i++ ) {
            if( $i % $step_link == 0 && $i !== $num_pages ) {
                if ( ++$dd == 1 ) 
                    $out.= '<li><a>'. $dotright_text2 .'</a></li>';
                $out.= '<li><a href="'. str_replace( '___', $i, $link_base ) .'">'. $i .'</a></li>';
            }
        }
    }
    // в конец
    if ( $end_page < $max_page ) {
        if( $dotright_text && $end_page != ($max_page-1) ) 
            $out.= '<li><a>'. $dotright_text2 .'</a></li>';
        $out.= '<li><a href="'. str_replace( '___', $max_page, $link_base ) .'">'. ( $last_page_text ? $last_page_text : $max_page ) .'</a></li>';
    }
    // вперед
    if ( $next_text && $paged != $end_page ) 
        $out.= '<li><a class="next i-next" href="'. str_replace( '___', ($paged+1), $link_base ) .'">'. $next_text .'</a></li>';

    $out .= "</ul>". $after ."\n";
    
    if ( ! $echo ) 
        return $out;
    echo $out;
}

Вот так вывожу продукты

<code>
<?php $count_product = 0 ?>
<?php $product = new WP_Query(array('post_type' => 'product', 'posts_per_page' => 8)); ?>
<?php while ($product->have_posts()) : $product->the_post(); ?>
***
<?php endwhile; ?>
</code>
  • Вопрос задан
  • 490 просмотров
Пригласить эксперта
Ответы на вопрос 1
Valonix
@Valonix
Back end / Front end developer
Есть готовый плагин(Pagenavi), туда передайте $product, только еще параметр paged нужен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы