Каждый мета-ключ поста может иметь несколько значений. Таким образом, вы получаете значения по умолчанию в виде массива; первая запись ( 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_key
s, и каждый meta_key
может иметь несколько meta_value
s.
Теперь давайте извлечем все пользовательские значения для поста 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
и вернул значение в виде строки.
Это наиболее читаемый вариант, используйте его для написания кода, который легко понять.