Фильтр ajax для вордпресс

после долгих исследований я наткнулся на это: https://rudrastyh.com/wordpress/ajax-post-filters.html

Но я могу заставить его работать только тогда, когда выбраны два варианта.

Я дам вам некоторый контекст: У меня есть CPT с именем «Contratistas», в котором есть две пользовательские таксономии «especialidad» и «industria», в каждом из них есть два термина «especialidad» -> «technologia» и «auditoria»; «индустрия» -> «культура» и «депоцито»

вот моя функция:

function misha_filter_function(){
    $args = array(
        'orderby' => 'date', // we will sort posts by date
        'order' => $_POST['date'], // ASC or DESC
        'post_per_page' => -1,
        'post_type' => 'contratista'
    );
    // for taxonomies / categories
    if ( isset( $_POST['filtroEspecialidad'] ) && isset ($_POST['filtroIndustria'])  ) {
        $args['tax_query'][] = array(
         //'relation' => 'AND',
            array(
                'taxonomy' => 'especialidad',
                'field' => 'id',
                'terms' => $_POST['filtroEspecialidad']
            ),
            array(
                'taxonomy' => 'industria',
                'field' => 'id',
                'terms' => $_POST['filtroIndustria']
            ),
        );
    
    } elseif ( !isset($_POST['filtroEspecialidad'] ) && isset($_POST['filtroIndustria'])  ) {
        $args['tax_query'][] = array(
            'taxonomy' => 'industria',
            'field' => 'id',
            'terms' => $_POST['filtroIndustria']
        );
    
    } elseif ( isset( $_POST['filtroEspecialidad'] ) && !isset($_POST['filtroIndustria'])  ) {
        $args['tax_query'][] = array(
            'taxonomy' => 'especialidad',
            'field' => 'id',
            'terms' => $_POST['filtroEspecialidad']
        );
    }

Это работает, если вы выбираете что-то из обеих таксономий, но когда одна из них пуста, она говорит: «Нет сообщений».

в качестве бонуса я хотел бы показать весь пост перед фильтрацией.

Я надеюсь, что кто-нибудь может мне помочь! Спасибо! Я довольно новичок в Wordpress

РЕДАКТИРОВАТЬ! Вот мой js и моя форма, тут я в недоумении не могу понять что не так :(

jQuery(function($){
    $('#filter').submit(function(){
        var filter = $('#filter');
        $.ajax({
            url:filter.attr('action'),
            data:filter.serialize(), // form data
            type:filter.attr('method'), // POST
            beforeSend:function(xhr){
                filter.find('.filtrar').text('Procesando...'); // changing the button label
            },
            success:function(data){
                filter.find('.filtrar').text('Filtrar'); // changing the button label back
                $('#response').html(data); // insert data
            }
        });
        return false;
    });

мой php-файл:

<form action = "<?php echo site_url() ?>/wp-admin/admin-ajax.php" method = "POST" id = "filter">
                    <div class = "titulo mb-3">
                        <h3>Especialidad</h3>
                    </div>
                    <?php
                        if ( $terms = get_terms( array( 'taxonomy' => 'especialidad', 'orderby' => 'name' ) ) ) : 
                 
                            echo '<select name = "filtroEspecialidad"><option value = "">Seleccione una especialidad...</option>';
                            foreach ( $terms as $term ) :
                                echo '<option value = "' . $term->term_id . '">' . $term->name . '</option>'; // ID of the category as the value of an option
                            endforeach;
                            echo '</select>';
                        endif;
                        
                    ?>
                    <div class = "titulo my-3">
                        <h3>Industrias</h3>
                    </div>
                    <?php   
                        if ( $terms = get_terms( array( 'taxonomy' => 'industria', 'orderby' => 'name' ) ) ) : 
                 
                            echo '<select name = "filtroIndustria"><option value = "">Seleccione una industria...</option>';
                            foreach ( $terms as $term ) :
                                echo '<option  value = "' . $term->term_id . '">' . $term->name . '</option>'; // ID of the category as the value of an option
                            endforeach;
                            echo '</select>';
                        endif;
                    ?>  
                    <button class = "my-3 filtrar">Filtrar</button>
                    <a href = "" id = "clear">Clear</a>
                    <input type = "hidden" name = "action" value = "myfilter">
                </form>
Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
1
0
724
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете еще раз взглянуть на параметры таксономии WP_Query(). К сожалению, WordPress немного путается с именами параметров id в контексте. Я не совсем уверен, что ваши первоначальные «оба» работают так, как вы предполагали, потому что 'field' => 'id' на самом деле недействителен.

Из документов:

поле (строка) – Выберите термин таксономии по. Возможные значения: term_id, name, slug или term_taxonomy_id. Значение по умолчанию — term_id.

id на самом деле не является допустимым вариантом. Если вы просто используете term_id, вы можете его опустить. Вы также можете просто программно добавить аргументы массива tax_query в зависимости от того, установлен ли этот фильтр, вместо проверки «both set, this set/that unset, this unset, that set», возможно, что-то вроде этого?

function misha_filter_function(){
    $args = array(
        'orderby'       => 'date', // we will sort posts by date
        'order'         => $_POST['date'], // ASC or DESC
        'post_per_page' => -1,
        'post_type'     => 'contratista'
    );

    if ( isset($_POST['filtroEspecialidad']) || isset($_POST['filtroIndustria']) ){
        $args['tax_query'] = array();
        
        if ( isset($_POST['filtroEspecialidad']) ){
            $args['tax_query'][] = array(
                'taxonomy' => 'especialidad',
                'terms'    => $_POST['filtroEspecialidad']
            );
        }
        
        if ( isset($_POST['filtroIndustria']) ){
            $args['tax_query'][] = array(
                'taxonomy' => 'industria',
                'terms'    => $_POST['filtroIndustria']
            );
        }

        if ( count($args['tax_query']) > 1 ){
            $args['tax_query']['relation'] = 'AND';
        }
    }

    // Run WP_Query with new $args, etc.
}

Я не уверен, являются ли значения $_POST массивами или отдельными числами, но вы можете проверить их с помощью array_map и/или absint, если вы используете пользовательский ввод, но если это просто идентификаторы, вышеизложенное должно работать на данный момент.

Это имеет большой смысл и лучше использует код, но он по-прежнему работает только тогда, когда выбраны и «especialidad», и «industria», но я думаю, что это правильный путь, поэтому я буду работать с ним !! Спасибо!! (Вы знаете, как я могу отобразить весь пост перед фильтрацией?)

Fernanda Sepulveda Sura 18.12.2020 13:59

К сожалению, если вышеописанное не сработало (так и должно быть), в игре может быть что-то еще, особенно в зависимости от того, как/когда вы вызываете функцию, изменяет ли она/заменяет основной запрос или нет, $_POST[' filtro…'] отправляются как пустые строки и т. д. (проверьте, чтобы убедиться, что они не отправляются, если они не выбраны). Re: Display Before, опять же, это зависит от того, как выглядит исходный запрос страницы на вашем конкретном сайте.

Xhynk 18.12.2020 22:27

Я обновил свой код! Спасибо за вашу помощь!!

Fernanda Sepulveda Sura 21.12.2020 16:14

функция .serialize() проходит по пустым значениям. Вы можете попробовать заменить data:filter.serialize(), на data: $('#filter :input').filter(function(index, element) { return $(element).val() != ''; }).serialize(),, чтобы убрать пустые значения и/или использовать empty($_POST['filter_name_here']) вместо isset()

Xhynk 21.12.2020 20:39

СПАСИБО!!!! ОНО РАБОТАЕТ!!! Вы дали мне много тем для изучения! (Я попробовал «пустой» подход, теперь я проверю другой!)

Fernanda Sepulveda Sura 21.12.2020 21:33

Пожалуйста! Вообще говоря, это более важно на стороне обработки/проверки (поэтому использования empty() должно быть достаточно), но отправка «как можно меньше данных по сети» также является хорошей практикой, поэтому, если вы можете заставить оба работать, отлично ! Если нет, просто используйте empty() должно быть хорошо, особенно в таком сценарии «фильтровать сообщения»! Рад помочь!

Xhynk 21.12.2020 22:31

Другие вопросы по теме