Вопрос или проблема
Я унаследовал проект, где предыдущий разработчик по какой-то причине создал пользовательский тип записи для авторов и настраиваемый выбор, отображающий все заголовки этих авторов в экране редактирования записей. Это привело к большому количеству дополнительного кода для обработки постоянных ссылок, шаблонов, правок и пользовательских запросов, в то время как все это можно было сделать из коробки.
Итак, я уже нашел способ создать всех отсутствующих пользователей из авторских пользовательских типов записей. Теперь я ищу 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';
Объяснение Запроса
- INNER JOIN – используется, чтобы объединить таблицы
wp_posts
иwp_postmeta
по полюpost_id
. - SET – указывает, какое поле (
post_author
) необходимо обновить и какое значение ему присвоить. Убедитесь, что значение нужно указывать в правильном формате (число без кавычек для ID). - 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. Выберите тот способ, который лучше всего соответствует вашим предпочтениям и требованиям проекта. Убедитесь, что вы предварительно создаете резервные копии баз данных перед выполнением таких обновлений, чтобы минимизировать риск потери данных.