Как отфильтровать записи по таксономии используя AJAX

20 апр. 2013 г., 22:47:52
Просмотры: 27.6K
Голосов: 3

Я нашел эту публикацию, которая описывает как фильтровать записи по категориям с помощью Ajax, и это отлично работает, но я также хочу таким же образом фильтровать мои пользовательские таксономии, и у меня не получается это сделать. Отображаются все записи вместо только тех, что принадлежат моей таксономии.

Я знаю, что в меню нужно изменить get_the_terms вместо get_the_categories, но мне конкретно нужна помощь с тем, что изменить в функции jQuery и PHP-функции внизу. Я пробовал добавить tax_query с указанием моей таксономии, но все равно отображаются неправильные записи. Может кто-нибудь помочь и указать верное направление?

8
Комментарии

Я получаю фатальную ошибку undefined function при попытке использовать get_the_categories(). Вы уверены, что не имели в виду get_the_category?

s_ha_dum s_ha_dum
20 апр. 2013 г. 23:00:59

@s_ha_dum Это то, что использовал оригинальный разработчик, но вы, возможно, правы. Этот код уже несколько лет, так что, возможно, функция изменилась? Я даже не использую это для вызова списка категорий, так как хочу иметь возможность выводить их в определенном порядке. Мои ссылки на категории выглядят так: <li id="cat-8"><a class="category ajax" onclick="cat_ajax_get('8');" href="#">Категория</a></li>

Emily Emily
20 апр. 2013 г. 23:46:02

Похоже, вы делаете что-то отличное от того поста, на который ссылались. Пожалуйста, отредактируйте свой вопрос, включив в него ваш код.

s_ha_dum s_ha_dum
21 апр. 2013 г. 00:32:56

@s_ha_dum Ок, без проблем. Я не думал, что это будет полезно, так как очевидно неправильно. По сути, я просто попытался заменить все вхождения "cat" на "term". У меня недостаточно опыта в PHP, чтобы точно знать, что именно нужно изменить для работоспособности, и я ничего не знаю о jQuery.

Emily Emily
21 апр. 2013 г. 01:36:22

Я разобрался с проблемой! Оказалось, мне просто нужно было переименовать все ajax-действия, так как они уже использовались для фильтрации категорий. Как только я это сделал и скорректировал свой tax_query, всё заработало. Я отредактировал код, чтобы показать правильную версию на случай, если это кому-то поможет.

Emily Emily
21 апр. 2013 г. 22:40:03

Тебе следует опубликовать своё решение как полноценный ответ и пометить его как "Принятый"

s_ha_dum s_ha_dum
21 апр. 2013 г. 22:55:54

@s_ha_dum Хорошо, я только что это сделал. Система не позволит мне принять ответ в течение 23 часов, но я вернусь и сделаю это завтра.

Emily Emily
21 апр. 2013 г. 23:21:44

Я могу хотя бы проголосовать за вас. Самостоятельное решение вопросов радует моё сердце. :)

s_ha_dum s_ha_dum
21 апр. 2013 г. 23:33:16
Показать остальные 3 комментариев
Все ответы на вопрос 3
0

Я разобрался! Вот код, который я использовал:

Добавьте в functions.php:

add_action( 'wp_ajax_nopriv_load-filter2', 'prefix_load_term_posts' );
add_action( 'wp_ajax_load-filter2', 'prefix_load_term_posts' );
function prefix_load_term_posts () {
        $term_id = $_POST[ 'term' ];
            $args = array (
            'term' => $term_id,
            'posts_per_page' => -1,
            'order' => 'DESC',
                 'tax_query' => array(
                  array(
                      'taxonomy' => 'yourtaxonomyhere',
                      'field'    => 'id',
                      'terms'    => $term_id,
                      'operator' => 'IN'
                      )
                  )
             );

        global $post;
        $myposts = get_posts( $args );
        ob_start (); ?>

        <ul class="list">
        <?php foreach( $myposts as $post ) : setup_postdata($post); ?>
            <li><a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php echo get_post_meta($post->ID, 'image', $single = true); ?></a><br />
             <?php the_title(); ?></li>
       <?php endforeach; ?>
        </ul>

       <?php wp_reset_postdata(); 
       $response = ob_get_contents();
       ob_end_clean();
       echo $response;
       die(1);
}

jQuery скрипт:

<script>
function term_ajax_get(termID) {
    jQuery("a.ajax").removeClass("current");
    jQuery("a.ajax").addClass("current"); //добавляет класс current к текущему пункту меню категории для стилизации через css
    jQuery("#loading-animation").show();
    var ajaxurl = 'http://yourdomain.com/wp-admin/admin-ajax.php';
    jQuery.ajax({
        type: 'POST',
        url: ajaxurl,
        data: {"action": "load-filter2", term: termID },
        success: function(response) {
            jQuery("#category-post-content").html(response);
            jQuery("#loading-animation").hide();
            return false;
        }
    });
}
</script>

Я не использую функцию для вывода списка категорий, а просто перечисляю каждую отдельно. Замените число на ID вашего термина:

<ul class="nav">
     <li id="term-166"><a class="yourtermname ajax" onclick="term_ajax_get('166');" href="#">Название вашего термина</a></li>
     <li id="term-354"><a class="yourtermname ajax" onclick="term_ajax_get('354');" href="#">Название вашего термина</a></li>
</ul>

Также, если вы хотите фильтровать метки вместо терминов, замените:

  • 'term' на 'tag__in',
  • $term_id на $tag_id
  • и измените 'taxonomy' => 'yourtaxonomyhere' на 'taxonomy' => 'post_tag'.
21 апр. 2013 г. 23:14:58
0

Предлагаю использовать шорткод для отображения таксономии по вашему выбору: создайте класс для объявления шорткода и вызовите эту функцию

  public function shortcode($atts)
{
 extract(shortcode_atts( array(
    'data' => 'taxonomy',
    'taxonomy' => 'category',
    //аргументы get_terms
    'parent' => 0, //по умолчанию получаем только термины верхнего уровня
    'exclude'=>'',
    'type'=>'radio' // checkbox,radio
    ), $atts,'astSearchInput' ));

$arrStr =array();
$arrStr[]= "<div class='astSearchInput " . $taxonomy. "' taxonomy='" .$taxonomy. "'>"  ;
if ($type=="checkbox" || $type=="radio")
{
    if ($data=="taxonomy")
        {
        //echo $datatata;
        $arrValues=get_terms($taxonomy, array("parent"=>$parent, "exclude"=>$exclude)); 
        }


     if ($type=="checkbox")$arrStr[]= $this->inputCheckBox($arrValues,$atts);
     if ($type=="radio")$arrStr[]= $this->inputRadio($arrValues,$atts);
}
$arrStr[]= "</div>";
$str=join("\n",$arrStr);
return $str  ;
}


    function inputCheckBox($arrValues,$attr)
{
    $arrStr =array();
    $arrStr[]='<div class="formcb">';
    foreach($arrValues as $k=>$term)
        {
            $title=$term->name; //$term->description 
            //  print_r($term);
            $id="cb" . $term->term_id;
            $arrStr[]='<div class="cb"><input class="astInpuntTerm astcheckBox" type="checkbox" id="' . $id  .'" value="' . $term->term_id . '" ><label for="' . $id . '">' . $title. '</label></div>';
        }
    $arrStr[]='</div>'; 
    $str=join("\n",$arrStr);    
        return $str;
}

http://www.webmasterbulletin.net/wordpress-ajax-taxonomy-search-shortcode

15 июл. 2014 г. 14:53:29
0

У меня была похожая проблема.

Код хороший, но требует небольшой модификации для работы.

            $args = array (
        'term' => $term_id,
        'posts_per_page' => -1,
        'order' => 'DESC',
             'tax_query' => array(
              array(
                  'taxonomy' => 'yourtaxonomyhere', // ваша таксономия здесь
                  'field'    => 'id',
                  'terms'    => $term_id,
                  'operator' => 'IN'
                  )
              ),
               'post_type' => 'yourcustomposttype', // ваш пользовательский тип записи <== этого не хватало
'posts_per_page' => 10,
'order' => 'DESC'
         );
18 апр. 2015 г. 12:07:50