Я пытаюсь предоставить своим пользователям способ изменения количества элементов, отображаемых на странице, в любой момент времени. Но я не совсем уверен, как это сделать;
Я видел более старый пост в стеке здесь , но $showposts
устарел, и теперь у нас также есть фильтр pre_get_posts
. Который, я думал, мог бы выполнять работу по мере необходимости.
Вопрос:
Каков наилучший способ передачи моих якорей атрибут данных в WP, posts_per_page
параметр с использованием pre_get_posts
фильтра или нет?
РЕДАКТИРОВАТЬ: 13 ИЮЛЬ 22: 47
Вот что у меня есть:
<div class="btn-group">
<button class="btn btn-sm dropdown-toggle px-0 mr-3" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Show:
</button>
<div class="dropdown-menu">
<a class="dropdown-item active" href="javascript:;" data-handle="display" data-value="15">15 items per page</a>
<a class="dropdown-item" href="javascript:;" data-handle="display" data-value="30">30 items per page</a>
<a class="dropdown-item" href="javascript:;" data-handle="display" data-value="45">45 items per page</a>
<a class="dropdown-item" href="javascript:;" data-handle="display" data-value="60">60 items per page</a>
</div>
</div>
Мой фильтр functions.php
// . Custom Search for Catalogue items
// . =================================
function catalogue_search( $query ) {
if (isset($_GET['display'])) {
$selValue = $_GET['display'];
} else {
$selValue = 15;
}
if ( $query->is_search() && 'products' === $query->get( 'post_type' ) ) {
$query->set( 'posts_per_page', $selValue );
}
}
add_action( 'pre_get_posts', 'catalogue_search' );
Мой JQ.
$("document").ready(function() {
sortBy = null;
display = null;
setTimeout(function() {
if ($(".dropdown-menu a").data('handle') == 'sort_by') {
sortBy = '&' + $(this).data('handle') + '=' + $(this).data('value');
}
if ($(".dropdown-menu a").data('handle') == 'display') {
display = '&' + $(this).data('handle') + '=' + $(this).data('value');
}
$('.btn-group').find('.active').trigger('click');
}, 10);
$(".dropdown-menu a").click(function() {
if ($(this).data('handle') == 'sort_by') {
sortBy = '&' + $(this).data('handle') + '=' + $(this).data('value');
}
if ($(this).data('handle') == 'display') {
display = '&' + $(this).data('handle') + '=' + $(this).data('value');
}
$(this).closest('.btn-group').find(".dropdown-menu a").removeClass('active');
$(this).addClass('active');
$(this).closest('.btn-group').find('.appended').remove();
$(this).closest('.btn-group').find('button').append('<span class="appended">' + $(this).text() + '</span>');
window.location.hash = sortBy + display;
});
});
Этот JS Fiddle должен дать вам рабочий пример моих текущих выпадений BS4.
ПРИМЕЧАНИЕ:
С новым JS согласно предложению @ Chris мой URL теперь читается как таковой;
domain.com/?s=&post_type=products&submit=#&sort_by=recent&display=15
Я подумал, что это проблема $GET
, но я не уверен, как ее решить ...
var_dump($_GET);
отображает следующее;
array(3) {
["s"]=> string(0) ""
["post_type"]=> string(8) "products"
["submit"]=> string(0) ""
}
Должен отобразиться;
array(3) {
["s"]=> string(0) ""
["post_type"]=> string(8) "products"
["submit"]=> string(0) ""
["display"]=> string(0) ""
}
Имея это в виду, я добавил;
// . Add Query Vars
// . =======================
function add_query_vars_filter( $vars ) {
$vars[] = 'display';
return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
Проблема все еще сохраняется. : /