offset и max_num_pages в постраничной галерее

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

Я переписал код галереи и остановился на пагинации. Как я могу получить максимальное количество страниц? На данный момент я не могу это определить и поставил тест для числа 5.

(Здесь "for ($ i = 1; $ i <= 5; $ i++)" здесь "if ($ paged <5))."

И как сделать так, чтобы работал параметр смещения в пагинации? Сейчас, когда я устанавливаю параметр смещения, пагинация не работает правильно. Мне нужно опубликовать 16 картинок, post_per_page равно 4. Я не нашел решения для моего конкретного случая. Может быть, это может быть заменено чем-то? Вот мой полный код в functons.php

remove_shortcode("gallery");
add_shortcode("gallery","my_gallery");

function my_gallery($atts){
    $img_id = explode(',', $atts['ids']);
    if(!$img_id[0]) {
        return '<div class="no-img-gallery">Нет изображений</div>';
    }

    $paged = get_query_var('paged') ? get_query_var('paged') : 1;
    $pictures = get_posts( array(
        'posts_per_page' => 4,
        'post__in'       => $img_id,
        'paged' => $paged,
        'post_type'      => 'attachment',
    ) );

    $html="<div class="gallery-my">";
    foreach ($pictures as $item){

        $img_desc = $item->post_content;
        $img_caption = $item->post_excerpt;
        $img_title = $item->post_title;
        $img_thumb = wp_get_attachment_image_src($item->ID);
        $img_full = wp_get_attachment_image_src($item->ID,medium);


        $html .="
        <div class="item-gallery">
            <a href="https://wordpress.stackexchange.com/questions/210945/{$img_full[0]}">
                <img src="{$img_thumb[0]}" width="{$img_thumb[1]}" height="{$img_thumb[2]}" alt="{$img_title}">
            <div class="desc-wrap">
                    <strong class="title-img">{$img_title}</strong>
                    <span class="desc-img">{$img_desc}</span>
                </div>
            </a> 
        </div>";

    }

    $html .= "</div>";
//Пагинация
    $html .= "<div class="pagination-gallery">";
        if ($paged > 1) { 
            $html .="<span class="prev-cust">
                        <a href="?paged=".($paged-1).""><</a>
                    </span></div>";
        }
        for($i=1;$i<=5;$i++){
            $html .="<span class="num-pag">
                <a href="?paged=".$i"""";

            if($paged==$i){
                 $usl="class="selected"";
            }
            else{
                 $usl="";
            }

            $html .=$usl.">".$i."</a></span>";
        }
        if ($paged < 5) { 
            $html .="<span class="prev-cust">
                        <a href="?paged=".($paged+1)."">></a>
                    </span></div>";
        }

    $html .= "</div>";                              


    return $html;

}

Если вам нужно max_num_pages, вам нужно использовать WP_Query вместо get_posts. Затем вы можете использовать $your_query_object->max_num_pages в вашем коде.

offset и paged не работают вместе, потому что оба в конечном итоге устанавливают LIMIT в MySQL-запросе. Параметр запроса offset всегда будет переопределять paged. Если вы хотите сместить результаты, вам нужно будет сделать расчеты самостоятельно, умножить номер страницы на количество записей на страницу и добавить смещение, а затем использовать только offset. Подробнее смотрите в статье Создание пользовательских запросов с использованием смещения и пагинации.

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

Конечно, давайте рассмотрим ваш вопрос о настройке пагинации в вашей галерее изображений на WordPress, используя инструменты WP Query вместо get_posts. Это позволит вам корректно настроить вывод и использовать параметры, такие как max_num_pages.

Что не так с текущим решением?

  1. Вывод максимального количества страниц: В вашем коде сейчас фиксировано значение 5 для значения количества страниц, что может вызывать проблемы, если у вас будет больше изображений. Фиксация логики пагинации на этом значении ограничивает гибкость вашего кода.

  2. Конфликт offset и paged: В случае использования двух параметров, как offset и paged, происходит конфликт, так как они оба влияют на наложение LIMIT в MySQL запросе. Это препятствует корректной работе пагинации.

Решение с использованием WP_Query

Ниже я предлагаю обновлённое решение, использующее WP_Query:

function my_gallery($atts) {
    $img_id = explode(',', $atts['ids']);
    if (!$img_id[0]) {
        return '<div class="no-img-gallery">Нет изображений</div>';
    }

    $paged = get_query_var('paged') ? get_query_var('paged') : 1;
    $posts_per_page = 4;

    $args = array(
        'post_type'      => 'attachment',
        'posts_per_page' => $posts_per_page,
        'post__in'       => $img_id,
        'paged'          => $paged,
    );

    $query = new WP_Query($args);

    $html = '<div class="gallery-my">';
    foreach ($query->posts as $item) {
        $img_desc = $item->post_content;
        $img_caption = $item->post_excerpt;
        $img_title = $item->post_title;
        $img_thumb = wp_get_attachment_image_src($item->ID);
        $img_full = wp_get_attachment_image_src($item->ID, 'medium');

        $html .= "
        <div class=\"item-gallery\">
            <a href=\"{$img_full[0]}\">
                <img src=\"{$img_thumb[0]}\" width=\"{$img_thumb[1]}\" height=\"{$img_thumb[2]}\" alt=\"{$img_title}\">
                <div class=\"desc-wrap\">
                    <strong class=\"title-img\">{$img_title}</strong>
                    <span class=\"desc-img\">{$img_desc}</span>
                </div>
            </a>
        </div>";
    }
    $html .= '</div>';

    // Pagination
    $html .= '<div class="pagination-gallery">';
    if ($paged > 1) {
        $html .= "<span class=\"prev-cust\"><a href=\"?paged=" . ($paged - 1) . "\">&lt;&lt;</a></span>";
    }

    for ($i = 1; $i <= $query->max_num_pages; $i++) {
        $class = ($paged == $i) ? 'class="selected"' : '';
        $html .= "<span class=\"num-pag\"><a href=\"?paged=$i\" $class>$i</a></span>";
    }

    if ($paged < $query->max_num_pages) {
        $html .= "<span class=\"next-cust\"><a href=\"?paged=" . ($paged + 1) . "\">&gt;&gt;</a></span>";
    }

    $html .= '</div>';

    return $html;
}

Краткие объяснения:

  1. WP_Query: Используем WP_Query, который предоставляет свойство max_num_pages, чтобы динамически определять количество страниц.

  2. Гибкость: Теперь количество страниц не фиксировано, а автоматически рассчитывается на основе количества изображений и параметра posts_per_page.

  3. Корректная пагинация: Обеспечивается корректная работа пагинации без конфликтов между offset и paged.

Заключение

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

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

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