get_post_meta замедляет загрузку моей страницы (в плагине)

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

На начальном этапе всего несколько событий это не было проблемой, но теперь, когда на системных страницах приходится более 100 событий, загрузка занимает до 6 секунд, что слишком велико.

Пример того, что я делаю: Показать все события в системе (все это делается внутри плагина). Я загружаю все события с помощью get_posts и указываю тип персонализированного сообщения. Я просматриваю все сообщения и получаю все метаданные с помощью get_post_meta за один вызов.

При тестировании, где было узкое место, я узнал, что когда я get_post_meta время выполнения сокращалось с 4,5 до get_post_meta . Я также проверил, что произойдет, если я буду загружать каждый метаданные отдельно: get_post_meta($post->ID, "meta_value", true);

Если у меня есть представление, где мне нужно всего лишь несколько метазначений, это ускорит процесс до тех пор, пока я не смогу сократить 20% времени загрузки, но когда мне нужно почти все, время загрузки не изменилось.

Я также заметил, что использование get_post_custom в этом случае не очень помогает.

После просмотра в Интернете (здесь, в блогах и т. Д.) Люди указали, что когда вы делаете get_posts , все метаданные автоматически извлекаются и кэшируются. Но, похоже, это не так, когда я смотрю на время выполнения и количество обрабатываемых запросов.

Есть ли способ ускорить это через php / mysql?

Единственное, о чем я думал, – это способ получить все сообщения и метаданные для каждого сообщения за один раз. Но мне не повезло найти что-то в Интернете, которое поможет мне в этом.

Вы должны использовать кеш объектов, это определенно ускорит запросы get_post_meta, поскольку они будут кэшироваться при выполнении начального WP_Query (get_posts).

Я рекомендую тестировать с использованием кеша APC, используя APC Object Cache Backend: https://wordpress.org/plugins/apc/

Просто отпустите файл в папке wp-content и убедитесь, что у вас есть расширение APC.