Налаштоване мета-поле публікації впливає на ефективність публікації


10

У мене є повідомлення, які містять багато визначених на замовлення метаполя. На посадах я телефоную їм за потребою get_post_meta. Значить для 10 метаполей, якими я користуюсь 10 разів.

Чи правильно я це роблю? Значить, чи є якісь проблеми з виконанням вищевказаного методу і якщо так, то як зменшити кількість дзвінків.

Мені відома відповідь, наявна тут: Спеціальні поля та продуктивність, яка пояснює, що використання "одного запиту". Але це не зрозуміло і здорово, тому запитайте ще раз, чи хтось знає і хоче поділитися детально.

Відповіді:


25

Щоб відповісти на це, я пішов і зробив кілька тестів на це, і результати насправді були душевними.

Ось мій тест

Для цього власноруч налаштуйте тестову сторінку. Просто скопіюйте сторінку.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>";

Яке відобразиться

Том Шторм


4
Це називається "Пройди розмову". Чудова відповідь.
Ахілеш

1
Моє задоволення, рада, що це вийшло для вас. Насолоджуйтесь :-)
Пітер Гусен

1
Це дуже приємно. Я хотів би побачити подібний тест, зосереджений на метамеріях користувача.
Крістін Купер

1
Однозначно варто це зробити ;-). Побачу, що я можу зробити в найближчі кілька днів, маю неспокійну пару днів попереду @ChristineCooper
Пітер Гузен

1
Приємно! Будь ласка, позначте мене на цій темі за допомогою посилання на випадок, якщо ви закінчите це робити!
Крістін Купер

0

Ви можете використовувати одразу get_post_metaвсі значення мета-поля.

$meta = get_post_meta( get_the_ID() );

Це отримає всі мета-значення даної публікації. Використовуйте цей масив замість отримання окремо.


0

Як зазначив Пітер Гусен, всі метадані для однієї публікації кешуються, коли ви запитаєте будь-які метадані вперше.

Це також справедливо для будь-яких дзвінків на 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та отримує метадані на 2 повідомлення, що є результатом оригіналу WP_Query.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.