web-dev-qa-db-ja.com

On postメタフィールドのインデックス[0]は何ですか?

テストを通じて私のPHP知識を向上させようとしてみてください。 WordPress PHPコードの後に​​[0]引数が混乱しています

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

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

それらはページ上の入力をインデックス化/参照するためのものですか?もしそうならなぜ彼らは同じですか?それらを使用する理由と使用時期を教えてください。

10
Behseini

各投稿メタキーは複数の値を持つことができます。そのため、デフォルトで値を配列として取得します。最初のエントリ(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は単一の値を返します。与えられたキーのpostメタ値の最初のエントリです。

get_post_meta()への最初の呼び出しはバックグラウンドでその投稿IDの all meta値を取得してキャッシュするので、その後の呼び出しは追加のデータベースクエリにはなりません。

たとえば、colorという名前の投稿メタキーを作成し、それに one postの3つの異なる値を入力します。それからキー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 notにこのメタキーをuniqueにするように伝えます - しかし一つのキーに複数の値を許すようにします。

結果のpostmetaテーブルの構造は次のようになります。

table

各行には一意のmeta_idがありますが、各post_idには複数のmeta_keyを含めることができ、各meta_keyには複数のmeta_valueを含めることができます。

それでは、ポスト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の内部構造です。現時点では無視します。ただ1つの値がありますが、これらの値も配列になります。
colorおよびageは、すべてのpost meta値のような配列です。
$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',
)

ここでは、メタ値のうちの1つだけを取得しています。 $color[0]はまだblueです。舞台裏では、WordPressは既にallカスタム値を取得しているので、次の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を取り、ストリングとして値を返しました。

これは最も読みやすいオプションです。理解しやすいコードを書くために使用してください。

16
fuxia