Вопрос или проблема
Я переписал код галереи и остановился на пагинации. Как я могу получить максимальное количество страниц? На данный момент я не могу это определить и поставил тест для числа 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.
Что не так с текущим решением?
-
Вывод максимального количества страниц: В вашем коде сейчас фиксировано значение 5 для значения количества страниц, что может вызывать проблемы, если у вас будет больше изображений. Фиксация логики пагинации на этом значении ограничивает гибкость вашего кода.
-
Конфликт 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) . "\"><<</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) . "\">>></a></span>";
}
$html .= '</div>';
return $html;
}
Краткие объяснения:
-
WP_Query: Используем WP_Query, который предоставляет свойство max_num_pages, чтобы динамически определять количество страниц.
-
Гибкость: Теперь количество страниц не фиксировано, а автоматически рассчитывается на основе количества изображений и параметра posts_per_page.
-
Корректная пагинация: Обеспечивается корректная работа пагинации без конфликтов между offset и paged.
Заключение
Настроив ваш код таким образом, вы добьетесь возможности более гибкого управления галереей изображений и улучшения пользовательского опыта. Убедитесь, что вы правильно управляете данными и работаете с самыми актуальными практиками WordPress.