AJAX фильтр категорий

7 янв. 2016 г., 20:28:40
Просмотры: 35.6K
Голосов: 4

Я понимаю, что это сложный вопрос, но я никак не могу разобраться.

Я нашел эту страницу: http://www.bobz.co/ajax-filter-posts-tag/#comment-28112

Там показано, как сделать динамический фильтр для меток записей.

Я хотел изменить его для категорий записей, но не могу заставить это работать.

Я поместил этот код в functions.php

function ajax_filter_posts_scripts() {
  // Подключаем скрипт
  wp_register_script('afp_script', get_stylesheet_directory_uri() . '/js/ajax-filter-posts.js', false, null, false);
  wp_enqueue_script('afp_script');

  wp_localize_script( 'afp_script', 'afp_vars', array(
        'afp_nonce' => wp_create_nonce( 'afp_nonce' ), // Создаем nonce, который позже будем использовать для проверки AJAX запроса
        'afp_ajax_url' => admin_url( 'admin-ajax.php' ),
      )
  );
}
add_action('wp_enqueue_scripts', 'ajax_filter_posts_scripts', 100);

// Скрипт для получения записей
function ajax_filter_get_posts( $taxonomy ) {

  // Проверяем nonce
  if( !isset( $_POST['afp_nonce'] ) || !wp_verify_nonce( $_POST['afp_nonce'], 'afp_nonce' ) )
    die('Доступ запрещен');

  $taxonomy = $_POST['taxonomy'];

  // WP Query
  $args = array(
    'category_name' => $taxonomy,
    'post_type' => 'post',
    'posts_per_page' => 10,
  );

  // Если taxonomy не установлена, удаляем ключ из массива и получаем все записи
  if( !$taxonomy ) {
    unset( $args['category_name'] );
  }

  $query = new WP_Query( $args );

  if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    <?php the_excerpt(); ?>

  <?php endwhile; ?>
  <?php else: ?>
    <h2>Записи не найдены</h2>
  <?php endif;

  die();
}

add_action('wp_ajax_filter_posts', 'ajax_filter_get_posts');
add_action('wp_ajax_nopriv_filter_posts', 'ajax_filter_get_posts');

а затем в шаблоне страницы я разместил этот код:

//в файле шаблона
<?php
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
);

$query = new WP_Query( $args );

function tags_filter() {
    $tax = 'category';
    $terms = get_terms( $tax );
    $count = count( $terms );

    if ( $count > 0 ): ?>
        <div class="post-tags">
        <?php
        foreach ( $terms as $term ) {
            $term_link = get_term_link( $term, $tax );
            echo '<a href="' . $term_link . '" class="tax-filter" title="' . $term->slug . '">' . $term->name . '</a> ';
        } ?>
        </div>
    <?php endif;
}

Когда я загружаю шаблон страницы, сайт загружает мой контент и показывает кнопки фильтра категорий, но когда я нажимаю на любую из кнопок, возвращается "Записи не найдены".

Это наводит меня на мысль, что я сделал что-то не так в файле functions, но я не могу понять что именно.

Кто-нибудь может увидеть, что я сделал неправильно?

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

Попробуйте пересмотреть аргументы в вашей функции ajax_filter_get_posts. Используйте что-то простое, что точно должно вернуть результаты, а затем отслеживайте проблему от этого момента.

jdm2112 jdm2112
7 янв. 2016 г. 22:31:16
Все ответы на вопрос 2
0

Не уверен, решили ли вы эту задачу, но я искал способ встроить это на страницу с фильтрацией записей по категориям.

Мне удалось заставить это работать так, чтобы отображались все категории и связанные с ними записи. Поместите этот код в functions.php

function ajax_filter_posts_scripts() {
  // Подключаем скрипт
  wp_register_script('afp_script', get_template_directory_uri() . '/js/ajax-filter-posts.js', false, null, false);
  wp_enqueue_script('afp_script');

  wp_localize_script( 'afp_script', 'afp_vars', array(
        'afp_nonce' => wp_create_nonce( 'afp_nonce' ), // Создаем nonce для проверки AJAX запроса
        'afp_ajax_url' => admin_url( 'admin-ajax.php' ),
      )
  );
}
add_action('wp_enqueue_scripts', 'ajax_filter_posts_scripts', 100);

// Скрипт для получения записей
function ajax_filter_get_posts( $taxonomy ) {

  // Проверяем nonce
  if( !isset( $_POST['afp_nonce'] ) || !wp_verify_nonce( $_POST['afp_nonce'], 'afp_nonce' ) )
    die('Доступ запрещен');

  $taxonomy = $_POST['taxonomy'];

  // WP Query
  $args = array(
    'category_name' => $taxonomy,
    'post_type' => 'post',
    'posts_per_page' => 10,
  );
  echo $taxonomy;
  // Если таксономия не указана, удаляем ключ из массива и получаем все записи
  if( !$taxonomy ) {
    unset( $args['tag'] );
  }

  $query = new WP_Query( $args );

  if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>
    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    <?php the_excerpt(); ?>

  <?php endwhile; ?>
  <?php else: ?>
    <h2>Записи не найдены</h2>
  <?php endif;

  die();
}

add_action('wp_ajax_filter_posts', 'ajax_filter_get_posts');
add_action('wp_ajax_nopriv_filter_posts', 'ajax_filter_get_posts');

Затем добавьте это в шаблон вашей страницы:

<?php $args = array(
            'post_type' => 'post',
            'posts_per_page' => 10,
        );

        $query = new WP_Query( $args );

        $tax = 'category';
        $terms = get_terms( $tax );
        $count = count( $terms );

        if ( $count > 0 ): ?>
            <div class="post-tags">
            <?php
            foreach ( $terms as $term ) {
                $term_link = get_term_link( $term, $tax );
                echo '<a href="' . $term_link . '" class="tax-filter" title="' . $term->slug . '">' . $term->name . '</a> ';
            } ?>
            </div>
        <?php endif;
        if ( $query->have_posts() ): ?>
        <div class="tagged-posts">
            <?php while ( $query->have_posts() ) : $query->the_post(); ?>

            <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <?php the_excerpt(); ?>

            <?php endwhile; ?>
        </div>

        <?php else: ?>
            <div class="tagged-posts">
                <h2>Записи не найдены</h2>
            </div>
        <?php endif; ?>

Надеюсь, это поможет решить вашу проблему!

29 авг. 2016 г. 18:16:27
0

В фильтре тегов измените $tax = 'post_tag'; на $tax = 'category';

Затем в WP Query измените 'tag' => $taxonomy, на 'category' => $taxonomy,

У меня работает отлично...

30 янв. 2018 г. 19:21:44