Я создаю функцию в wordpress, которая читает XML-файл и импортирует 100-500 событий в качестве типа сообщения в wordpress. События содержат много метаданных, которые сохраняются в виде метаданных. Один из элементов метаданных будет уникальным (строковым) идентификатором от каждого события в фиде XML.
Импортер будет настроен как wp_cron, чтобы убедиться, что наша база данных обновлена.
Чтобы убедиться, что я не добавляю дубликаты при каждом запуске импорта, я хотел бы проверить, существует ли сообщение с уникальным идентификатором, если оно будет обновляться, иначе вставить.
Так работает функция wp_insert_post с идентификатором сообщения. Если сообщение с указанным ID уже существует, оно будет обновляться вместо вставки.
Как я могу это достичь? Могу ли я запустить get_posts () с мета-запросом на каждую запись? Будет ли это эффективной или дорогостоящей работой? Будет ли это результатом многих запросов sql?
Любые советы о том, как сделать эту проверку, будут высоко оценены.
Вы можете выбирать между простотой и эффективностью.
Запуск get_posts()
с мета-запросом для каждой записи является самым простым подходом и будет выполнять эту работу. Конечно, как вы указали, есть соображения производительности.
Если вы ищете более эффективное решение, вам придется погрузиться так же глубоко, как слой базы данных, и запустить собственный запрос SELECT
. Затем сохраните результаты в ассоциативном массиве и проверьте каждую запись.
Что-то вроде следующего:
global $wpdb; // if we're in a function $q=" SELECT $wpdb->posts.ID,$wpdb->postmeta.meta_value FROM $wpdb->posts JOIN $wpdb->postmeta ON ($wpdb->posts.ID=$wpdb->postmeta.post_id) WHERE $wpdb->post.post_type='event' and $wpdb->postmeta.meta_name='xml_id' "; $rows=$wpdb->get_results($q,OBJECT); $events_idx=array(); foreach($rows as $row) $events_idx[$row->meta_value]=$row->ID;
После этого проверка того, существует ли уже существующее событие, так же проста, как isset($events_idx[$xml_id])
. И если это в конечном итоге существует, вы должны обновить сообщение с id
заданным $post_id=$events_idx[$xml_id]
.