ОБНОВЛЕНИЕ по результатам SELECT. SQL-запрос для замены автора на значение из метабокса.

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

Я унаследовал проект, где предыдущий разработчик по какой-то причине создал пользовательский тип записи для авторов и настраиваемый выбор, отображающий все заголовки этих авторов в экране редактирования записей. Это привело к большому количеству дополнительного кода для обработки постоянных ссылок, шаблонов, правок и пользовательских запросов, в то время как все это можно было сделать из коробки.

Итак, я уже нашел способ создать всех отсутствующих пользователей из авторских пользовательских типов записей. Теперь я ищу SQL-команду или скрипт, чтобы заменить обычного автора на нового на основе значения meta_key. Однако для некоторых записей это значение может быть null.

С помощью этого SQL-запроса я группирую все записи с определенным fake_author id:

SELECT ID, post_title FROM wp_posts JOIN wp_postmeta a ON ( a.post_id = wp_posts.ID AND a.meta_key='fake_author' AND a.meta_value="111111");

Как я могу выполнить обновление в столбце post_author для полученных записей?

Моя попытка до сих пор:

UPDATE wp_posts
INNER JOIN wp_postmeta a ON ( a.post_id = wp_posts.ID AND a.meta_key='fake_author' AND a.meta_value=111111)
SET post_author=2222222;

Однако это не дает никаких результатов.

Я всегда нахожу, что намного меньше запутывает получать результаты из одной таблицы и перебирать их, чем пытаться объединить их таким образом… например.

global $wpdb;
$query = "SELECT post_id FROM wp_postmeta WHERE meta_key='fake_author' AND meta_value="11111"";
$results = $wpdb->get_results($query);

foreach ($results as $result) {
    $query = "UPDATE wp_posts SET post_author="222222" WHERE ID='".$result->post_id."'";
    $wpdb->query($query);
}

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

Чтобы обновить значения поля post_author в таблице wp_posts, исходя из значений мета-ключа fake_author в таблице wp_postmeta, можно использовать SQL-запрос на объединение таблиц, однако важно учитывать синтаксис. Ваша попытка обновления была близка к правильному решению, но незапланированные ошибки могли привести к отсутствию результатов. Давайте разберем правильный подход к этой задаче.

Пояснение проблемы

Вы наследовали проект, где для авторов создавался пользовательский тип записи (CPT), и теперь требуется обновить поле post_author в таблице постов на основе значения мета-ключа fake_author. Важно также учитывать, что некоторые посты могут не иметь значения в данной мета-таблице (т.е. значение NULL).

SQL Запрос для Обновления

Используя правильный синтаксис для объединения таблиц, можно воспользоваться следующим запросом:

UPDATE wp_posts 
INNER JOIN wp_postmeta a ON a.post_id = wp_posts.ID 
SET wp_posts.post_author = 2222222
WHERE a.meta_key = 'fake_author' 
AND a.meta_value = '111111';

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

  1. INNER JOIN – используется, чтобы объединить таблицы wp_posts и wp_postmeta по полю post_id.
  2. SET – указывает, какое поле (post_author) необходимо обновить и какое значение ему присвоить. Убедитесь, что значение нужно указывать в правильном формате (число без кавычек для ID).
  3. WHERE – фильтрует записи, при этом значение мета-ключа fake_author должно равняться заданному.

Устранение Потенциальных Ошибок

Если указанный запрос всё равно не дает результатов:

  • Проверьте, действительно ли в таблице wp_postmeta существует строка с meta_value = '111111'.
  • Убедитесь, что мета-ключ fake_author правильно указан.
  • Проверьте, есть ли записи в wp_posts, соответствующие условиям.

Альтернативный Подход через PHP

Как вы заметили, другой способ – использовать PHP для выполнения запросов. Ваш код правильный, но нужно исправить синтаксис строковых значений:

global $wpdb;
$query = "SELECT post_id FROM wp_postmeta WHERE meta_key='fake_author' AND meta_value='111111'";
$results = $wpdb->get_results($query);

foreach ($results as $result) {
    $wpdb->update(
        'wp_posts',
        array('post_author' => '222222'), 
        array('ID' => $result->post_id)
    );
}

Заключение

Итак, теперь у вас есть два метода обновления поля post_author: через SQL-запрос и через PHP с использованием WordPress API. Выберите тот способ, который лучше всего соответствует вашим предпочтениям и требованиям проекта. Убедитесь, что вы предварительно создаете резервные копии баз данных перед выполнением таких обновлений, чтобы минимизировать риск потери данных.

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

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