Для чего нужен индекс [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являются массивами, как все мета значения post.
$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.