Как проверить наличие имени категории

Вопрос или проблема

У меня есть поле ввода, и когда пользователи вводят текст, происходит проверка на наличие введенного пользователем названия категории.

Js

(function($) {  // ready handler
$(".universalSearchField").keypress(function() {
     $.ajax({
        url: "/wp-admin/admin-ajax.php",
        type: "post",
        data: { action: "universalSearchlist", keyword: $("#searchdata").val() },
        success: function(data) {
            console.log(data);
           // $("#datafetch").html( data );
        }
    });
    });

    })(jQuery);

Function.php

 add_action('wp_ajax_universalSearchlist','universalSearch');
 add_action('wp_ajax_nopriv_universalSearchlist','universalSearch');
function universalSearch(){
$the_query = new WP_Query( array('category_name' => esc_attr( $_POST['universalSearchlist'] ), 'post_type' => 'post' ) );
    foreach ( $the_query->posts as $p ) {
    $categories = get_the_category($p->ID);
    if (!empty($categories) ) {
        echo esc_html( $categories[0]->name );   
    }
}

}

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

Используйте get_cat_ID(‘название категории’) https://developer.wordpress.org/reference/functions/get_cat_id/

<?php
$category_id = get_cat_ID('Category Name');
if($category_id > 0){
echo 'category exists';
}else{
echo 'category NOT exists';
}
?>

Использовать admin-ajax.php и писать собственный обработчик не обязательно, я бы обычно посоветовал создать REST API endpoint, но даже это не нужно здесь.

Просто попросите REST API получить категорию. Если он её возвращает, она существует, если нет — значит, её нет.

Например, https://example.com/wp-json/wp/v2/categories/?slug=categoryname

В JavaScript это может выглядеть так:

async function check_category_exists( slug ) {
    let response = await fetch( `https://example.com/wp-json/wp/v2/categories/?slug=${slug}` );

    if (response.ok) { // если HTTP-статус 200-299
        // получаем тело ответа (метод объяснен ниже)
        let json = await response.json();
        return ( json.length > 0 );
    } else {
        throw new Exception( "HTTP-Error: " + response.status );
    }
}

Теперь у нас есть асинхронная JS функция, которая получает термин и, если он найден, возвращает true, а если нет — false. Помните, что они возвращают промисы, аналогично AJAX функциям в jQuery и других местах. Вы будете использовать это так:

check_category_exists( "test" ).then(
    ( result ) => {
        if ( result ) {
            console.log( "test exists" );
        } else {
            console.log( "it does not exist" );
        }
    }
).catch(
    error => console.log( "something went wrong" )
);

Не забудьте изменить example.com на свой сайт, или, что еще лучше, сделайте так, чтобы WP предоставил путь к вашему REST API на странице, чтобы вы могли получить к нему доступ и использовать тот же код везде (подсказка: спросите об этом вопросе на сайте, это легко ответить, но есть много интересного, что нужно знать).

Также вы можете получить категории из REST API через /wp-json/wp/v2/categories и сохранить их в массив/список. Затем вы можете использовать массив для отображения элементов в вашем поиске и проверить, находится ли элемент в этом массиве, чтобы увидеть, существует ли он.

.

Ответ или решение

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

1. Использование REST API WordPress

WordPress предоставляет REST API, с помощью которого можно легко проверить наличие категории. Это более оптимальный и производительный способ, чем использование admin-ajax.php, поскольку не требует создания кастомных обработчиков.

Асинхронная функция на JavaScript:

Для начала мы создадим асинхронную функцию, которая будет отправлять запрос на REST API и проверять, существует ли категория.

async function check_category_exists( slug ) {
    let response = await fetch(`https://example.com/wp-json/wp/v2/categories/?slug=${slug}`);
    if (response.ok) {
        let json = await response.json();
        return (json.length > 0);
    } else {
        throw new Error( "HTTP-Error: " + response.status );
    }
}

// Использование функции
check_category_exists("категория").then((result) => {
    if (result) {
        console.log("Категория существует");
    } else {
        console.log("Категория не существует");
    }
}).catch(error => console.error("Произошла ошибка: " + error));

2. Обработка во время ввода

Можно реализовать проверку в момент, когда пользователь начинает вводить текст в поле. Это сделает интерфейс более интерактивным и отзывчивым.

Пример с событием keypress:

document.querySelector(".universalSearchField").addEventListener("keypress", function() {
    let query = this.value;
    check_category_exists(query).then((result) => {
        if (result) {
            console.log("Категория найдена");
        } else {
            console.log("Категория не найдена");
        }
    }).catch(error => console.error("Ошибка при проверке категории: " + error));
});

3. Предварительное кэширование категорий

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

Пример получения всех категорий:

async function getAllCategories() {
    let response = await fetch("https://example.com/wp-json/wp/v2/categories");
    if (response.ok) {
        let categories = await response.json();
        return categories.map(cat => cat.slug);
    } else {
        throw new Error("HTTP-Error: " + response.status);
    }
}

let categoryList = await getAllCategories();

function checkCategoryInList(slug, list) {
    return list.includes(slug);
}

// Использование
let exists = checkCategoryInList("example", categoryList);
console.log(exists ? "Категория существует" : "Категория не существует");

Заключение

Выбор метода зависит от вашего конкретного сценария использования и предпочтений. REST API обеспечивает гибкость и масштабируемость, а предварительное кэширование может быть полезным для улучшения производительности и снижения нагрузки на сервер. Внедрение проверки в момент ввода пользователем текста делает решение более интерактивным. Убедитесь, что вы заменили example.com на ваш реальный домен, чтобы успешно выполнить запросы.

Оцените материал
Добавить комментарий

Капча загружается...