Как передать слаг терма таксономии (taxonomy term slug) в файл functions.php в wordpress

Рейтинг: 0Ответов: 1Опубликовано: 14.08.2023

Мне нужен код, который будет подгружать посты по три штуки в div через WP ajax на странице CPT терминов таксономии (taxonomy term template). Мой код загружает сообщения, если я указываю только CPT без термина таксономии, но мне нужно, чтобы он загружал сообщения только с термином таксономии на странице шаблона таксономии. Моя проблема в том, что я не могу передать слаг термина в код в файле functions.php, он не видит его там 'terms' => $term_slug,. Я слышал, что это можно сделать с помощью функции WP_Term_query, но я не мог понять, как это сделать. Буду признателен за любое рабочее решение. Спасибо! Мой код ниже.

functions.php

add_action( 'wp_ajax_load_tax_results', 'load_tax_results' );
add_action( 'wp_ajax_nopriv_load_tax_results', 'load_tax_results' );

function load_tax_results() {
 
  $termid = get_queried_object()->term_id;
  $myterm = get_term($termid, 'product-type');
  $term_slug = $myterm->slug;

  $args = array(
    'post_type' => 'site-product',
    'posts_per_page' => 3,
    'paged' => $_POST['paged'],
    'tax_query' => array(
      array(
      'taxonomy' => 'product-type',
      'field' => 'slug',
      'terms' => $term_slug,
      ),
      ),
    );
    

    $wquery = new WP_Query($args);

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

 // stuff


<?php
endwhile;
wp_reset_postdata();
endif; 

 
wp_die();
            
}

custom.js

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

let loadMoreButton;

loadMoreButton = $('#comp-load-more-btn');
  
  let currentPage;
  currentPage = 1;

  loadMoreButton.on('click', function(e) {

    currentPage++;
    
      e.preventDefault();

      var button = $(this);

      $.ajax({
          url: '/wp-admin/admin-ajax.php',
          type: 'post',
          data: {
              'action': 'load_tax_results',
              'paged': currentPage,
          },
          beforeSend: function() {
              button.text('Загрузка...');
          },
          success: function(response) {
              // Append the new posts to the container
              $('#posts-here').append(response);
 
              button.text('Загрузить ещё...');

              // Hide the button if there are no more pages
              if ('' === response) {
                  button.hide();
              }
          } 
      });
  });

});

Ответы

▲ 1Принят

Ну давайте разбираться. Делаем wp_localize_script() Вашему custom.js скрипту, куда передаем в качестве первого параметра handle скрипта, название объекта посредством которого Вы получите эти данные в Вашем скрипте и массив нужных нам параметров (url по которому будем отправлять ajax запрос, сам slug который получим посредством get_queried_object() и wp nonce).

В обработчике же проверим этот самый wp_nonce при помощи check_ajax_referer() и далее получаем и фильтруем полученные данные при помощи filter_input().

<?php
// Там где подключаете скрипты, делаете wp_localize_script() вашему скрипту custom.js
add_action('wp_enqueue_scripts', function () {
    // Первым параметром указываете handle Вашего скрипта, вторым параметром название объекта и третьим параметром массив необходимых данных.
    wp_localize_script('custom', 'ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'term_slug' => get_queried_object()->slug ?? '',
        'nonce' => wp_create_nonce('ajax_nonce')
    ]);
});

add_action('wp_ajax_load_tax_results', 'load_tax_results');
add_action('wp_ajax_nopriv_load_tax_results', 'load_tax_results');

function load_tax_results() {
    // Проверяем ajax nonce
    check_ajax_referer('ajax_nonce', 'nonce');
    // Получаем и фильтруем данные
    $term_slug = filter_input(INPUT_POST, 'term_slug', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $paged = filter_input(INPUT_POST, 'paged', FILTER_SANITIZE_NUMBER_INT) ?: 1;

    $args = [
        'post_type' => 'site-product',
        'posts_per_page' => 3,
        'paged' => $paged,
        'tax_query' => [
            [
                'taxonomy' => 'product-type',
                'field' => 'slug',
                'terms' => $term_slug,
            ],
        ],
    ];

    $query = new WP_Query($args);

    if ($query->have_posts() ) :
        while($query->have_posts() ) : $query->the_post(); ?>
            <!-- Your loop code -->
        <?php
        endwhile;
        wp_reset_postdata();
    endif;

    wp_die();
}

В Вашем JS вместо подстановки напрямую '/wp-admin/admin-ajax.php' мы можем взять это значение из объекта ajax_object и то же самое с nonce и term_slug которые хранятся в том же объекте.

jQuery(document).ready(function($){
    const loadMoreButton = $('#comp-load-more-btn');
    let currentPage = 1;

    loadMoreButton.on('click', function(e) {
        e.preventDefault();
        const button = $(this);
        
        currentPage++;

        $.ajax({
            url: ajax_object.ajax_url,
            type: 'POST',
            data: {
                'action': 'load_tax_results',
                'paged': currentPage,
                'term_slug': ajax_object.term_slug,
                'nonce': ajax_object.nonce,
            },
            beforeSend: function() {
                button.text('Загрузка...');
            },
            success: function(response) {
                // Append the new posts to the container
                $('#posts-here').append(response);

                button.text('Загрузить ещё...');

                // Hide the button if there are no more pages
                if ('' === response) {
                    button.hide();
                }
            }
        });
    });
});