Программная настройка категорий продуктов WooCommerce, работает, но продукт не отображается в cat

#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, который применяется.