после долгих исследований я наткнулся на это: 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>
Вы можете еще раз взглянуть на параметры таксономии 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
, если вы используете пользовательский ввод, но если это просто идентификаторы, вышеизложенное должно работать на данный момент.
К сожалению, если вышеописанное не сработало (так и должно быть), в игре может быть что-то еще, особенно в зависимости от того, как/когда вы вызываете функцию, изменяет ли она/заменяет основной запрос или нет, $_POST[' filtro…'] отправляются как пустые строки и т. д. (проверьте, чтобы убедиться, что они не отправляются, если они не выбраны). Re: Display Before, опять же, это зависит от того, как выглядит исходный запрос страницы на вашем конкретном сайте.
Я обновил свой код! Спасибо за вашу помощь!!
функция .serialize()
проходит по пустым значениям. Вы можете попробовать заменить data:filter.serialize(),
на data: $('#filter :input').filter(function(index, element) { return $(element).val() != ''; }).serialize(),
, чтобы убрать пустые значения и/или использовать empty($_POST['filter_name_here'])
вместо isset()
СПАСИБО!!!! ОНО РАБОТАЕТ!!! Вы дали мне много тем для изучения! (Я попробовал «пустой» подход, теперь я проверю другой!)
Пожалуйста! Вообще говоря, это более важно на стороне обработки/проверки (поэтому использования empty()
должно быть достаточно), но отправка «как можно меньше данных по сети» также является хорошей практикой, поэтому, если вы можете заставить оба работать, отлично ! Если нет, просто используйте empty()
должно быть хорошо, особенно в таком сценарии «фильтровать сообщения»! Рад помочь!
Это имеет большой смысл и лучше использует код, но он по-прежнему работает только тогда, когда выбраны и «especialidad», и «industria», но я думаю, что это правильный путь, поэтому я буду работать с ним !! Спасибо!! (Вы знаете, как я могу отобразить весь пост перед фильтрацией?)