Фильтрация продуктов по категории Ajax по умолчанию показывает все

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

У меня есть код, который перечисляет категории и продукты по категориям.

Когда я нажимаю “Все”, он показывает все продукты, но когда я перехожу на страницу /products, по умолчанию он не показывает все продукты, и мне нужно нажать “Все”, чтобы получить все продукты. Как я могу получить все продукты при переходе на страницу /products по умолчанию без нажатия на какую-либо категорию или ссылку “Все”?

Мой functions.php

function add_custom_scripts() {
wp_enqueue_script( 'ajax_term', get_stylesheet_directory_uri() . '/ajax/ajax-terms.js', array('jquery'), NULL, true );
wp_localize_script( 'ajax_term', 'wpAjax', array('ajaxUrl' => admin_url('admin-ajax.php')));    
}
add_action( 'wp_enqueue_scripts', 'add_custom_scripts' );

Products.php – страница /products

<div class="categories">
<ul class="categories-filter" name="categoryfilter">
    <li><a type="button" data-posttype="product" class="js-filter-item" href="<?php echo home_url(); ?>">Все</a></li>
    <?php
    if( $terms = get_terms( array( 
        'taxonomy' => 'product_cat' ) ) ) : 

        foreach ( $terms as $term ) :
        
         ?>
        <li>
            <a type="button" data-category="<?php echo $term->term_id; ?>" 
                data-posttype="product" 
                    data-taxonomy="<?php echo $term->taxonomy; ?>" class="js-filter-item" href="<?php echo $term->term_id; ?>" >
                <?php echo $term->name; ?>
        </a>
        </li>
    <?php 
          endforeach; 
          endif; 
    ?>
</ul>
</div>

<div id="response"></div>

Ajax-terms.js

(function($){

$(document).ready(function(){
    $(document).on('click', '.js-filter-item', function(event){
        (event).preventDefault();

        var category = $(this).data('category');

        $.ajax({
            url: wpAjax.ajaxUrl,
            data: { 
                action: 'filterterm', 
                category: category, 
                taxonomy:  $(this).data('taxonomy'),
                posttype:  $(this).data('posttype')
                },
            type: 'post',
            success: function(result){
                $('#response').html(result);
            },
            error: function(result){
                console.warn(result);
            }
        });
    });
});
})(jQuery);

Обработчик в functions.php

<?php

add_action('wp_ajax_nopriv_filterterm', 'filter_ajax_term');
add_action('wp_ajax_filterterm', 'filter_ajax_term');

function filter_ajax_term(){

$category = $_POST['category'];

 $args = array(
    'post_type' => 'product', 
    'posts_per_page' => -1, 
    'orderby'   => 'NAME', 
    'order' => 'ASC'
 );

 if(isset($category)) {
    $args['tax_query'] = 
    array( 
        array( 
                'taxonomy' => $_POST['taxonomy'], //или тег или пользовательская таксономия
                'field' => 'id', 
                'terms' => array((int)$category) 
            ) 
    ); 

}
 
$the_query = new WP_Query( $args ); ?>

    <div class="container">

        <?php if ( $the_query->have_posts() ) : 
            while ( $the_query->have_posts() ) : $the_query->the_post(); 
            
            $category = get_the_category(); 

            the_title('<h2>', '</h2>');
    
        endwhile; endif; ?>

    </div>

<?php

die();
}
?>

Во-первых, вам следует использовать REST API для фронтенда вместо admin-ajax.
Во-вторых, не следует использовать непроверенные значения POST.
А для ваших продуктов при загрузке страницы вам нужно сказать вашему Javascript заполнить ID “response”, когда ID присутствует.
Сейчас вы загружаете продукты только при срабатывании события нажатия на элемент класса js-filter-item.
Попробуйте это с помощью вспомогательной функции, подобной этой.

(function($){$(document).ready(function(){

if ($('#response').length){

  function load_all_products() {
    var category = $(this).data('category');

    $.ajax({
        url: wpAjax.ajaxUrl,
        data: { 
            action: 'filterterm', 
            category: category, 
            taxonomy:  $(this).data('taxonomy'),
            posttype:  $(this).data('posttype')
            },
        type: 'post',
        success: function(result){
            $('#response').html(result);
        },
        error: function(result){
            console.warn(result);
        }
    });
  }

  load_all_products();

  $('.js-filter-item').on('click', function(event){
      (event).preventDefault();
      load_all_products();
  });
}

});
})(jQuery);

Это не тестировалось и не будет работать копированием и вставкой, но, возможно, вы поймете суть.
Когда ID “response” присутствует, вызывайте функцию load_all_products().
Когда вы нажимаете на фильтр с классом “js-filter-item”, вызывайте эту функцию с выбранной кнопкой/фильтром/чем угодно.
Возможно, вам придется изменить вызовы $(this).data(xxx) на корректные значения.
Для пагинации вам нужно будет добавить переменную страницы.

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

Как установить отображение всех продуктов по умолчанию на странице /products

Вам необходимо настроить свою систему таким образом, чтобы при переходе на страницу /products отображались все продукты без необходимости нажимать на кнопку "Все". В данном ответе мы проанализируем ваш текущий код и представим решение этой задачи.

1. Проблема

Когда пользователь заходит на страницу /products, ваши текущие настройки требуют, чтобы он кликнул на ссылку "Все", чтобы увидеть все продукты. Это может затруднить опыт пользователей, и вы хотите, чтобы все продукты были отображены сразу.

2. Анализ кода

На данный момент ваша структура кода выглядит следующим образом:

  • functions.php – здесь вы добавляете необходимые скрипты и метаданные для AJAX.
  • products.php – на этой странице происходит фактическое отображение категорий и самих продуктов.
  • ajax-terms.js – JavaScript, который обрабатывает нажатия на фильтры и отправляет AJAX запрос для фильтрации продуктов.
  • Обработчик AJAX в functions.php, который получает выбранные категории и возвращает соответствующие продукты.

3. Решение

Чтобы автоматически загружать все продукты при загрузке страницы, вам нужно внести изменения в файл ajax-terms.js, чтобы она загружала все продукты, если элемент с ID response существует. Вот как это можно сделать:

Измените ajax-terms.js
(function($) {
    $(document).ready(function() {
        // Функция для загрузки всех продуктов
        function load_all_products() {
            $.ajax({
                url: wpAjax.ajaxUrl,
                data: {
                    action: 'filterterm',
                    category: '', // Ищем все продукты, оставляем category пустым
                    taxonomy: '',  // Не нужно указывать таксономию для всех продуктов
                    posttype: 'product'
                },
                type: 'post',
                success: function(result) {
                    $('#response').html(result);
                },
                error: function(result) {
                    console.warn(result);
                }
            });
        }

        // Загружаем все продукты при загрузке страницы
        if ($('#response').length) {
            load_all_products();
        }

        // Обработчик клика по элементам фильтра
        $(document).on('click', '.js-filter-item', function(event) {
            event.preventDefault();
            var category = $(this).data('category');
            $.ajax({
                url: wpAjax.ajaxUrl,
                data: {
                    action: 'filterterm',
                    category: category,
                    taxonomy: $(this).data('taxonomy'),
                    posttype: $(this).data('posttype')
                },
                type: 'post',
                success: function(result) {
                    $('#response').html(result);
                },
                error: function(result) {
                    console.warn(result);
                }
            });
        });
    });
})(jQuery);
Объяснение изменений:
  1. Автоматическая загрузка: При загрузке страницы, если существует элемент с ID response, вызывается функция load_all_products(), которая отправит AJAX запрос для получения всех продуктов.

  2. Параметры AJAX: Параметры category и taxonomy оставлены пустыми для первого запроса, чтобы отобразить все продукты без необходимости выбора категории.

4. Исполнение

После внесения изменений на сайте, протестируйте страницу /products. Вы должны увидеть, что все продукты отображаются автоматически без необходимости нажимать на ссылку "Все".

5. SEO оптимизация

Для повышения видимости страницы в поисковых системах удостоверьтесь, что:

  • Все заголовки (например, <h2> для названия продуктов) используют соответствующие ключевые слова, чтобы улучшить результаты поиска.
  • Убедитесь, что используете мета-теги, заголовки и альт-теги на изображениях на странице для лучшей индексации.

Следуя представленным выше инструкциям, вы улучшите пользовательский опыт на странице /products и создадите более оптимизированную платформу для ваших клиентов.

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

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