Вопрос или проблема
В данный момент я работаю с 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 терминов, что позволит избежать путаницы в данных. Не забывайте, что для устранения любых проблем стоит тщательное тестирование настроек вашей админ-панели.
Если у вас остались вопросы или требуется помощь с конкретными моментами, не стесняйтесь задавать их.