Обновить термины постов в WordPress программно

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

В данный момент я работаю с WooCommerce для WordPress и создаю собственный плагин.

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

$catTerms = get_terms('product_cat', array('hide_empty' => 0, 'orderby' => 'ASC'));

Это получает все категории продуктов при выполнении цикла.

Затем я добавляю чекбоксы к элементам в цикле следующим образом:

<label><input name="" type="checkbox" value="" id="cat_term_<?php echo $catTerm->name;?>" name="cat_term[]" /><?php echo $catTerm->name; ?></label>

Затем я сохраняю термины таким образом, что это не работает:

$prod_cats = $_POST['cat_term'];
wp_set_post_categories( $id, $prod_cats );

Я также пробовал следующее:

wp_set_object_terms( $id, $prod_cats );

И:

wp_set_post_terms( $id, $prod_cats );

Есть ли что-то, что я делаю неправильно? Может быть, я не сохраняю их правильным образом?

Полный код по запросу:

<?php 
            $cats = array();            
            $product->get_categories();


            //print_r($cats);


             $terms = wp_get_post_terms( get_the_id(), 'product_cat' );


             foreach ($terms as $term){
                 $cats[] =  $term->name;
             }

        print_r($cats);

            ?>

            <?php $catTerms = get_terms('product_cat', array('hide_empty' => 0, 'orderby' => 'ASC')); ?>
            <?php foreach($catTerms as $catTerm) : ?>


            <?php if (in_array($catTerm->name, $cats)){ ?>

            <label><input name="" type="checkbox" value="" id="cat_term_<?php echo $catTerm->name;?>" name="cat_term[]" checked="checked" /><?php echo $catTerm->name; ?></label><br />             

            <?php } else { ?>

            <label><input name="" type="checkbox" value="" id="cat_term_<?php echo $catTerm->name;?>" name="cat_term[]" /><?php echo $catTerm->name; ?></label><br />


            <?php } ?>

            <?php endforeach; ?>
            <?php } ?>


if (isset($_POST['save'])) {
    $id = $_POST['item_id'];

    $prod_cats = $_POST['cat_term'];

    wp_set_post_terms( $id, $prod_cats );


}

Пожалуйста, добавьте название таксономии в функцию wp_set_post_terms.

wp_set_post_terms( $id, $prod_cats, 'product_cat' );

Пожалуйста, обратитесь к wpcodex wp_set_post_terms

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

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

1. Получение и отображение категорий

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

<label>
    <input name="cat_term[]" type="checkbox" value="<?php echo $catTerm->term_id; ?>" id="cat_term_<?php echo $catTerm->term_id; ?>" <?php checked(in_array($catTerm->term_id, wp_list_pluck($terms, 'term_id'))); ?> />
    <?php echo $catTerm->name; ?>
</label><br />

2. Сохранение выбранных категорий

После того как администратор выберет нужные категории и отправит форму, необходимо правильно обработать отправленные данные. Вы правы, что необходимо использовать функцию wp_set_post_terms, но не забудьте указать таксономию, как в вашем комментарии:

if (isset($_POST['save'])) {
    $id = intval($_POST['item_id']);
    $prod_cats = (isset($_POST['cat_term']) && is_array($_POST['cat_term'])) ? array_map('intval', $_POST['cat_term']) : []; // Приведение к массиву ID

    // Обновление категорий
    wp_set_post_terms($id, $prod_cats, 'product_cat');
}

3. Важно проверить наличие ошибок

После выполнения операции обновления, рекомендуется проверить на наличие ошибок:

if (is_wp_error($result)) {
    // Ошибка при обновлении, обработайте её
    $error_message = $result->get_error_message();
    // Выводите или логируйте сообщение об ошибке
} else {
    // Успешно обновлено
}

4. Полный пример кода

Привожу полный пример кода с учетом вышеописанных замечаний:

<?php 
if (isset($_POST['save'])) {
    $id = intval($_POST['item_id']);
    $prod_cats = (isset($_POST['cat_term']) && is_array($_POST['cat_term'])) ? array_map('intval', $_POST['cat_term']) : [];

    // Обновление категорий
    wp_set_post_terms($id, $prod_cats, 'product_cat');
}

// Получение и отображение категорий продуктов
$cats = [];
$terms = wp_get_post_terms(get_the_ID(), 'product_cat'); 
foreach ($terms as $term) {
    $cats[] = $term->term_id; // Получаем ID для дальнейшей работы
}

$catTerms = get_terms('product_cat', ['hide_empty' => 0, 'orderby' => 'ASC']);
foreach ($catTerms as $catTerm) {
    ?>
    <label>
        <input name="cat_term[]" type="checkbox" value="<?php echo $catTerm->term_id; ?>" id="cat_term_<?php echo $catTerm->term_id; ?>" <?php checked(in_array($catTerm->term_id, $cats)); ?> />
        <?php echo $catTerm->name; ?>
    </label><br />
    <?php
}
?>

Заключение

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

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

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

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