Intereting Posts
Theme Customizer – выберите, где появится область виджета, чтобы пользователи могли организовать виджетов Как определить, включен ли индекс форума bbPress Как добавить несколько экземпляров мета-поля в пользовательский тип сообщения получить все сообщения, связанные с пользовательской таксономией Функция, которая удаляет теги HTML <div> и </ div> из строки? Как изменить нежелательные дополнительные столбцы администратора? Strip $ before & $ после строк из заголовка страницы WP REST API: проверьте, зарегистрирован ли пользователь jQuery не работает для загрузчика мультимедиа Разрешение HTML в описаниях меню Отменить настройку цвета в Настройке тем Неправильные заголовки для контактной формы Ссылка подтверждения была отправлена ​​на ваш (текущий адрес электронной почты) как ограничить поиск заголовков сообщений? Обнаружение темы используется

Лучший способ проверить, существует ли сообщение с конкретным мета

Я создаю функцию в 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] .