#php #wordpress #woocommerce #wordpress-admin
#php #wordpress #woocommerce #wordpress-администратор
Вопрос:
Я передаю массив идентификаторов продуктов (в виде целых чисел) в приведенную ниже функцию, которая также принимает текущий идентификатор категории. Это запускается на экране редактирования категории продукта в WordPress / WooCommerce admin и, по сути, является просто быстрым способом присвоить несколько продуктов текущей категории. Идея заключается в том, что любой из этих продуктов, которые в настоящее время не входят в эту категорию, присваивается категории.
Это работает до определенной степени. Когда я сбрасываю объекты продукта, отображается недавно добавленная категория, и категория отмечена на экране редактирования продукта. Однако при просмотре категории во внешнем интерфейсе продукты не отображаются. Затем, зайдя в администратор сайта, отредактировав продукт (без изменений) и обновив его, он отобразится в категории на интерфейсе. Таким образом, кажется, что продукт необходимо сохранить, прежде чем он появится, но это не должно быть так, и он по-прежнему не работает при программном сохранении продукта в функции ниже.
Я добавил if
оператор, чтобы также добавить дочерние элементы в категорию, просто чтобы исключить это, но это не помогает.
Может кто-нибудь, пожалуйста, дать мне проверку на вменяемость по этому поводу?
function spc_assign_new_products($term_id, $product_ids)
{
$new_products = wc_get_products([
'limit' => -1,
'include' => $product_ids,
'status' => 'publish',
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => [$term_id],
'operator' => 'NOT IN',
'include_children' => false,
]
],
]);
foreach ($new_products as $product) {
wp_set_object_terms($product->get_id(), (int) $term_id, 'product_cat', true);
if ($children = $product->get_children()) {
foreach ($children as $child_id) {
wp_set_object_terms($child_id, (int) $term_id, 'product_cat', true);
}
}
}
}
Var, сбрасывающий объекты продукта до и после нажатия update в admin, не показывает никаких различий, кроме измененных временных меток, поэтому я в недоумении. Я также исключил кэширование, полностью отключив его на локальном сайте разработчика.
Комментарии:
1.
wp_set_object_terms()
Возвращает ли ваш массив терминов илиWP_Error
2. Хороший вопрос, спасибо @Josh. Он возвращает массив с $term_id, который применяется.