Для чого індекс [0] для метаметалів пост?


10

Намагаюся покращити свої знання PHP за допомогою тесту та спробуйте! Мене плутають [0] аргументи в наступному PHP-коді WordPress

global $post;
$custom = get_post_custom($post->ID);
$price = $custom['price'][0];
$coMake = $custom['coMake'][0];

echo $custom['price'][0];

Вони для індексації / посилання вхідних даних на сторінці? якщо так, чому вони однакові ?! можете, будь ласка, дайте мені знати, чому і коли ними користуватися?

Відповіді:


17

Кожен мета-ключ повідомлення може мати кілька значень. Таким чином, ви отримуєте значення за замовчуванням як масив; перший запис ( 0) - найдавніший.

get_post_custom()отримує всі мета-клавіші зі своїми значеннями. Ви можете спростити свій код за допомогою:

$price  = get_post_meta( $post->ID, 'price', TRUE );
$comake = get_post_meta( $post->ID, 'coMake', TRUE );

Коли останній параметр для get_post_meta()є TRUE, WordPress поверне одне значення: перший запис мета-значення пост для даного ключа.

Перший виклик до get_post_meta()буде отримувати та кешувати всі мета-значення для цього ідентифікатора публікації у фоновому режимі, тому пізні дзвінки не призводять до додаткових запитів до бази даних.

Приклад

Скажімо, ми створюємо мета-ключ публікації з назвою colorі заповнюємо його трьома різними значеннями для однієї публікації. Потім робимо те ж саме з ключем age.

add_action( 'wp_loaded', function() {

    foreach ( array ( 'blue', 'red', 'yellow' ) as $color )
        add_post_meta( 561, 'color', $color, FALSE );

    foreach ( array ( '14', '40', '104' ) as $age )
        add_post_meta( 561, 'age', $age, FALSE );
});

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

Отримана структура в нашій postmetaтаблиці буде виглядати приблизно так:

стіл

Кожен рядок має унікальний meta_id, але кожен post_idможе мати декілька meta_keys, і кожен meta_keyможе мати декілька meta_values.

Тепер давайте виберемо всі спеціальні значення для публікації 561:

add_action( 'shutdown', function(){

    $custom = get_post_custom( 561 );
    print '<pre>' . esc_html( var_export( $custom, TRUE ) ) . '</pre>';
});

Результат:

array (
  '_edit_last' => 
  array (
    0 => '1',
  ),
  '_edit_lock' => 
  array (
    0 => '1367617428:1',
  ),
  'color' => 
  array (
    0 => 'blue',
    1 => 'red',
    2 => 'yellow',
  ),
  'age' => 
  array (
    0 => '14',
    1 => '40',
    2 => '104',
  ),
)

_edit_lastі _edit_lockє внутрішніми службами WordPress, на даний момент ми це ігноруємо. Відзначимо, ми отримуємо ці значення і масиву, хоча є лише одне значення.
colorі ageє масивами, як і всі мета-значення пост.
$custom['color'][0]є blue.

Тепер ми отримуємо лише колір із get_post_meta():

add_action( 'shutdown', function(){

    $color = get_post_meta( 561, 'color' );
    print '<pre>' . esc_html( var_export( $color, TRUE ) ) . '</pre>';
});

Результат:

array (
  0 => 'blue',
  1 => 'red',
  2 => 'yellow',
)

Тут ми отримуємо лише один фрагмент наших мета-значень. $color[0]є досі blue. За лаштунками WordPress вже отримав усі спеціальні значення, тому наступне звернення до нього ageбуде подано з кеша.
За рівнем продуктивності get_post_custom()і get_post_meta()рівні.

Остання спроба. Отримайте колір get_post_meta()як одне значення.

add_action( 'shutdown', function(){

    $color = get_post_meta( 561, 'color', TRUE );
    print '<pre>' . esc_html( var_export( $color, TRUE ) ) . '</pre>';
});

Результат: blue.

WordPress зробив те, що ви зробили у своєму коді: він взяв ключ масиву 0і повернув значення у вигляді рядка.

Це найбільш читаний варіант, використовуйте його для написання коду, який легко зрозуміти.

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