Вопрос или проблема
Поскольку функция “Рекомендуемые продукты” 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
.
Пример структуры запроса
- Сначала для выбора нужных продуктов мы можем использовать 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.