Обновите список продуктов, чтобы сделать их рекомендованными, если у продукта есть мета-значение (Mysql, а не wpquery).

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

Поскольку функция “Рекомендуемые продукты” WooCommerce 3 – это имя и слуг таксономии ‘product_visibility’.

Мне нужно обновить все продукты с тем же значением meta_value, содержащееся в списке, на ‘рекомендуемые’.

У моих продуктов есть meta_key = ‘product_cip’

Мой список cip для сравнения с ‘product_cip’ (1234657,1263709,4563832,837472) и т.д.

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

SELECT post_title, ID FROM wp_posts
INNER JOIN wp_postmeta wm ON (wm.post_id = wp_posts.ID)
INNER JOIN wp_term_relationships wtr ON (wp_posts.ID = wtr.object_id)
INNER JOIN wp_term_taxonomy wtt ON (wtr.term_taxonomy_id = wtt.term_taxonomy_id)
INNER JOIN phiz_terms wt ON (wt.term_id = wtt.term_id) AND ((wtt.taxonomy = 'product_visibility' AND  wt.slug = 'featured'))
    WHERE post_type="product" AND post_status="publish"

Спасибо,

ИЗМЕНЕНИЕ:

global $wpdb;

// Выбрать все продукты, которые нужно обновить как 'рекомендуемые'
    $q = 'SELECT wp_posts.ID ';
    $q .= 'FROM wp_posts ';

// Присоединить таблицу wp_postmeta
    $q .= 'JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) ';
// Присоединить таблицы таксономии и термина
    $q .= 'JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) ';
    $q .= 'JOIN wp_term_taxonomy ON ( wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id ) ';
    $q .= 'JOIN wp_terms ON ( wp_term_taxonomy.term_id = wp_terms.term_id ) ';

// Условия WHERE
    $q .= 'WHERE ';
// Запись должна быть опубликована
    $q .= 'wp_posts.post_status =  "publish" ';

    $q .= 'AND ';
// Запись должна иметь тип поста "product"
    $q .= 'wp_posts.post_type =  "product" ';

    $q .= 'AND ';
// Запись должна иметь meta_key = product_cip
    $q .= '(';
    $q .= 'wp_postmeta.meta_key =  "product_cip" ';
    $q .= 'AND ';
    $q .= 'wp_postmeta.meta_value IN ("3664592000014","3401097399423","4015630064779","3400941662003","3400941631245","3401321104311","3401051049166","3400936760578","3400938341836","3401021104543","3400939035765","4015630057009","3401097592640","3401060246723","3662042003295","3401096745795","3401097024363","3401099724896","3400935709042","3400935167156","3401021104482","3400936751934","3401096745856","3400936348288","3400934965852","3400922096612","3400933043445","3664490000031","3400932897162","7323190196562","3400936666795","3400939472898") ';
    $q .= ')';

    $wpdb->get_results($q);

С этим я получаю продукты, которые нужно обновить, как изменить этот результат на рекомендуемые продукты?

ИЗМЕНЕНИЕ 2:

function update_products_tofeatured_for_home($atts)
{
    global $wpdb;

// Выбрать все продукты, которые нужно обновить как 'рекомендуемые'
    $q = 'SELECT wp_posts.ID ';
    $q .= 'FROM wp_posts ';

// Присоединить таблицу wp_postmeta
    $q .= 'JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) ';
// Присоединить таблицы таксономии и термина
    $q .= 'JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) ';
    $q .= 'JOIN wp_term_taxonomy ON ( wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id ) ';
    $q .= 'JOIN wp_terms ON ( wp_term_taxonomy.term_id = wp_terms.term_id ) ';

// Условия WHERE
    $q .= 'WHERE ';
// Запись должна быть опубликована
    $q .= 'wp_posts.post_status =  "publish" ';

    $q .= 'AND ';
// Запись должна иметь тип поста "product"
    $q .= 'wp_posts.post_type =  "product" ';

    $q .= 'AND ';
// Запись должна иметь meta_key = product_cip
    $q .= '(';
    $q .= 'wp_postmeta.meta_key =  "product_cip" ';
    $q .= 'AND ';
    $q .= 'wp_postmeta.meta_value IN ("3664592000014","3401097399423","4015630064779","3400941662003","3400941631245","3401321104311","3401051049166","3400936760578","3400938341836","3401021104543","3400939035765","4015630057009","3401097592640","3401060246723","3662042003295","3401096745795","3401097024363","3401099724896","3400935709042","3400935167156","3401021104482","3400936751934","3401096745856","3400936348288","3400934965852","3400922096612","3400933043445","3664490000031","3400932897162","7323190196562","3400936666795","3400939472898") ';
    $q .= ')';

    $products = $wpdb->get_results($q);

    //var_dump($products);

    foreach ($products as $prd)
    {
        $term_taxonomy_ids = wp_set_object_terms( $prd, 'featured', 'product_visibility' );

        if ( is_wp_error( $term_taxonomy_ids ) ) {
            // Произошла ошибка и термины не могли быть установлены.
        } else {
            // Успех!
        }
    }
}

Еще не тестировалось.

Хорошо, я создал плагин администратору для этого… Если у вас есть лучшее решение 🙂 Я в деле

Создать кнопку для администратора для открытия CSV файла с значениями meta_value для сравнения с существующими продуктами и обновить продукты как рекомендуемые, если они существуют.

add_action('admin_menu', 'featured_button_menu');
function featured_button_menu()
{
    add_menu_page('Страница рекомендуемых продуктов', 'Миссия призвания продуктов', 'manage_options', 'featured-button-slug', 'featured_button_admin_page');
}

function featured_button_admin_page()
{
    // Общая проверка разрешений пользователя.
    if (!current_user_can('manage_options'))
    {
        wp_die( __('У вас недостаточно разрешений для доступа к этой странице.'));
    }

    // Начинаем строить страницу
    echo '<div class="wrap">';
    echo '<h2>Обновить продукты, выделенные (CSV)</h2>';

    // Проверить, была ли нажата кнопка И также проверить nonce
    if (isset($_POST['featured_button']) && check_admin_referer('featured_button_clicked'))
    {
        // Кнопка была нажата И мы прошли проверку безопасности
        featured_button_action();
    }
    echo '<form action="options-general.php?page=featured-button-slug" method="post">';
    // Функция безопасности WordPress
    wp_nonce_field('featured_button_clicked');
    echo '<input type="hidden" value="true" name="featured_button" />';
    submit_button('Запустить процесс');
    echo '</form>';
    echo '</div>';
}

function featured_button_action()
{
    global $wpdb;

    $filepath = $_SERVER['DOCUMENT_ROOT']."/data/featured.csv";

    $cip_array = [];
    $resInt = [];

    $handle = fopen($filepath, "r") or die("Ошибка при открытии файла");
    while(($line = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $cip_array[] = $line;
    }
    fclose($handle);

    foreach($cip_array as $res) {
        $resUTF8 = mb_convert_encoding($res[0], 'UTF-8');
        $resInt[] = intval($resUTF8);
    }
    $List = implode(',', $resInt);

    $products = $wpdb->get_results("SELECT phiz_posts.ID
                            FROM phiz_posts
                                JOIN phiz_postmeta ON ( phiz_posts.ID = phiz_postmeta.post_id )
                                JOIN phiz_term_relationships ON ( phiz_posts.ID = phiz_term_relationships.object_id )
                                JOIN phiz_term_taxonomy ON ( phiz_term_relationships.term_taxonomy_id = phiz_term_taxonomy.term_taxonomy_id )
                                JOIN phiz_terms ON ( phiz_term_taxonomy.term_id = phiz_terms.term_id )
                            WHERE phiz_posts.post_status="publish"
                                AND phiz_posts.post_type="product"
                                AND phiz_postmeta.meta_key =  'product_cip'
                                AND phiz_postmeta.meta_value IN (.$List.) ");

    foreach ($products as $prd)
    {
        $term_taxonomy_ids = wp_set_object_terms( $prd->ID, 'featured', 'product_visibility' );
        if ( is_wp_error( $term_taxonomy_ids ) ) {
            echo "Произошла ошибка и термины не могли быть установлены.<br>";
        }
    }
}

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

Обновление списка продуктов в статус "Рекомендуемые" с использованием MySQL

Введение

В данной статье мы рассмотрим, как обновить статус продуктов на "Рекомендуемые" в WooCommerce через прямой запрос SQL, вместо использования WP_Query. Это может быть полезно для оптимизации работы с большим количеством данных и для более глубокого понимания структуры базы данных WordPress.

Контекст задачи

Согласно требованиям, у нас есть:

  • Ключ метаданных product_cip, который используется для идентификации продуктов.
  • Список значений CIP, на основе которых мы будем определять, какие продукты следует пометить как "Рекомендуемые".
  • Необходимо обновить статус товаров на "Рекомендуемые", используя таксономию product_visibility.

Пример структуры запроса

  1. Сначала для выбора нужных продуктов мы можем использовать SQL-запрос. А затем обновим статус выбранных продуктов через wp_set_object_terms.
function update_featured_products() {
    global $wpdb;

    // Задаем значения для поиска
    $cip_values = [
        "1234657", "1263709", "4563832", "837472" // И так далее...
    ];

    // Формируем строку с перечислением значений cips для использования в SQL-запросе
    $cip_list = "'" . implode("', '", $cip_values) . "'";

    // Запрос для выборки ID продуктов
    $query = "
        SELECT wp_posts.ID 
        FROM wp_posts 
        INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 
        WHERE wp_posts.post_status = 'publish' 
        AND wp_posts.post_type = 'product' 
        AND wp_postmeta.meta_key = 'product_cip' 
        AND wp_postmeta.meta_value IN ($cip_list)
    ";

    // Выполняем запрос и получаем продукты
    $products = $wpdb->get_results($query);

    // Обновляем статус продуктов на "Рекомендуемые"
    foreach ($products as $product) {
        $term_taxonomy_ids = wp_set_object_terms($product->ID, 'featured', 'product_visibility');

        // Обрабатываем возможные ошибки
        if (is_wp_error($term_taxonomy_ids)) {
            error_log('Ошибка при обновлении продукта ID: ' . $product->ID);
        }
    }
}

Объяснение запроса

  • Мы используем INNER JOIN для подключения таблиц wp_postmeta к wp_posts, чтобы получить все необходимые продукты с метадателями.
  • Условие post_status = 'publish' гарантирует, что мы работаем только с опубликованными товарами.
  • Используем массив значений CIP, который проверяем с помощью условия IN.
  • После получения нужных ID продуктов, мы используем wp_set_object_terms для добавления термина featured к категории product_visibility.

Заключение

Использование перечисленных подходов позволяет эффективно обновлять статус товаров в WooCommerce и управлять ими без необходимости глубокого знания API WordPress. Такой способ подходит для администраторов и разработчиков, которые хотят оптимизировать свои действия по управлению контентом. Обязательно протестируйте код на тестовом сервере перед использованием на рабочем.


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

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

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