Intereting Posts
WordPress Multisite: добавление действий только на один сайт Как просмотреть свой веб-сайт без верхней панели администратора WordPress, но оставаться в нем? Получить список условий для определенной категории Запросить текущие и будущие события, упорядоченные по дате начала Присвоить один признанный образ нескольким сообщениям? Исключить старые события из WP_Query с датой, сохраненной в `meta_key` Добавить содержимое в заголовок виджета в области администратора внутри виджета? Получать сообщения и включать таксономический термин Перенаправить на список сообщений по таксономии по выбору пользователя для выведения таксономии? Как отобразить / включить конкретный jpg на странице Фильтровать сообщения / страницы с помощью user_role array Собственная тема WordPress с пользовательскими АФК> Экспортировать все в формат темы? Вопрос об этикете при разрыве плагина? Ориентация на конкретный экземпляр wp_list_pages Боковая панель не отображается на странице блога, но отлично со статическими страницами

Эффект персонализированного почтового мета-поля на производительность на почте

У меня есть записи, которые имеют множество настраиваемых мета-полей. В сообщениях я get_post_meta их по требованию, используя get_post_meta . Средство для 10 мета-полей Я использую его 10 раз.

Правильно ли я это делаю? Значит, существует ли какая-либо проблема с вышеописанным методом, и если да, то как уменьшить количество вызовов.

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

Solutions Collecting From Web of "Эффект персонализированного почтового мета-поля на производительность на почте"

Чтобы ответить на этот вопрос, я пошел и сделал несколько тестов по этому поводу, и результаты были фактически раздуты.

Вот мой тест

Для этого задайте себе тестовую страницу. Просто скопируйте page.php, переименуйте его и удалите цикл. Теперь просто создайте новую страницу в конце. Прежде чем начать, сначала проверьте свой таймер с пустой информацией, чтобы получить количество запросов без каких-либо данных

Я создал 5 мета-полей для тестового поста,

  • enclosure ,
  • First name ,
  • Last name ,
  • packages и
  • post_views_count

У моего тестового поста был идентификатор 530 . Внутри сообщения вы можете просто использовать $post->ID или get_the_ID() чтобы установить идентификатор сообщения

Итак, мой первый тест был следующим:

 <?php timer_start(); $a = get_post_meta(530, 'enclosure', true); $b = get_post_meta(530, 'First name', true); $c = get_post_meta(530, 'Last name', true); $d = get_post_meta(530, 'packages', true); $e = get_post_meta(530, 'post_views_count', true); ?> <p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p> 

что дало мне следующие результаты

1 запрос: 0.00195 секунд.

Мой второй тест был следующим:

 <?php timer_start(); $a = get_post_meta(530); ?> <p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p> 

что, на удивление, дало тот же результат

1 запрос: 0.00195 секунд.

Если вы посмотрите на исходный код для get_post_meta() , вы увидите, что get_post_meta() просто просто оболочка для get_metadata() . Значит, вам нужно было посмотреть. Исходный код для get_metadata() , вы увидите, что метаданные получают кеширование.

Так что на ваш вопрос о том, что использовать и о производительности, ответ будет, это зависит от вас. Вы видели доказательство в результатах

По моему личному мнению, если вам нужно получить 10 полей метаданных (или в моем случае 5), используйте второй подход в моем ответе.

 $a = get_post_meta(530); 

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

Как раз в качестве примера, вот мой вывод из $a если я делаю var_dump( $a );

 array(9) { ["_edit_lock"]=> array(1) { [0]=> string(12) "1414838328:1" } ["_edit_last"]=> array(1) { [0]=> string(1) "1" } ["_custom_sidebar_per_page"]=> array(1) { [0]=> string(7) "default" } ["post_views_count"]=> array(1) { [0]=> string(1) "0" } ["packages"]=> array(1) { [0]=> string(1) "0" } ["repeatable_names"]=> array(1) { [0]=> string(79) "a:1:{i:0;a:3:{s:4:"role";s:4:"fool";s:4:"name";s:6:"Pieter";s:3:"url";s:0:"";}}" } ["enclosure"]=> array(1) { [0]=> string(105) "http://localhost/wordpress/wp-content/uploads/2014/09/Nissan-Navara-Tough-City.avi 13218974 video/avi " } ["First name"]=> array(1) { [0]=> string(3) "Tom" } ["Last name"]=> array(1) { [0]=> string(5) "Storm" } } 

Теперь вы можете получить доступ к любой из возвращаемых метаданных в своем сообщении следующим образом:

 echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>"; 

Что будет отображаться

Том Шторм

Вы можете использовать get_post_meta для получения всех значений get_post_meta одновременно.

 $meta = get_post_meta( get_the_ID() ); 

Это позволит получить все метаданные данного сообщения. Используйте этот массив, а не выбор по отдельности.

Как заявил Пиет Гоузен, все метаданные для одной записи кэшируются, когда вы впервые запрашиваете метаданные.

Это также верно для любых вызовов WP_Query . Как только вы вызываете WP_Query , WordPress извлекает метаданные для всех полученных сообщений в одном запросе.

В худшем случае вы вызываете get_post_meta для отдельных почтовых идентификаторов, которые ранее не были получены WordPress. В этом случае каждый вызов get_post_meta приведет к одному запросу.

Пример трассировки из запроса в wp_postmeta внутри WP_Query :

 SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (491,347) ORDER BY meta_id ASC #0 /wp-includes/wp-db.php(1567): wpdb->_do_query('SELECT post_id,...') #1 /wp-includes/wp-db.php(1958): wpdb->query('SELECT post_id,...') #2 /wp-includes/meta.php(814): wpdb->get_results('SELECT post_id,...', 'ARRAY_A') #3 /wp-includes/post.php(5546): update_meta_cache('post', Array) #4 /wp-includes/post.php(5529): update_postmeta_cache(Array) #5 /wp-includes/query.php(3614): update_post_caches(Array, 'post', true, true) #6 /wp-includes/query.php(3836): WP_Query->get_posts() #7 /wp-includes/query.php(3946): WP_Query->query(Array) #8 /wp-content/plugins/***/***.php(134): WP_Query->__construct(Array) 

Как вы можете видеть, вызов происходит изнутри get_posts и извлекает метаданные для двух сообщений, что является результатом исходного WP_Query .