1

そこで、Wordpress を少しバックエンドに統合しようとしています。特に Woocommerce を追加する場合、彼らの MySQL スキーマはあまり優れていません。

次のクエリを思いつきました。

SELECT wp.* 
FROM   wp_postmeta wp
       INNER JOIN (SELECT post_id 
                   FROM   wp_postmeta
                   WHERE  ( `meta_key` = '_shipping_method' 
                            AND `meta_value` = 'free_shipping' ) 
                           OR ( `meta_key` = '_order_items' 
                                AND `meta_value` LIKE '%search%' )) a 
               ON a.post_id = wp.post_id 
ORDER  BY wp.post_id DESC

このテーブルhttp://i.imgur.com/YBaGq.jpgで実行して、特定の人々に適したものを選択します。

PHPでこれをvar_dumpすると、(切り捨てられた)ようになります- http://pastebin.com/WR3byT8k

これを配列に適切にマップして、次のような単純なものを使用できるようにする方法はありますか?

echo $content['_billing_first_name']; 
echo $content['_billing_last_name'];

どちらが出力されますか:
John Citizen

すべてのコンテンツは動的であるため、行番号だけを使用することはできません。

4

1 に答える 1

0

取得する必要があるメタ キーのセットが固定されている場合 (固定された順序である必要はありません)、ピボット テーブルと同様の手法を使用して、クエリ自体でそれを行うことができます。

SELECT 
  post_id,
  MAX(CASE WHEN meta_key = '_billing_first_name' THEN meta_value ELSE NULL END) AS _billing_first_name,
  MAX(CASE WHEN meta_key = '_billing_last_name' THEN meta_value ELSE NULL END) AS _billing_last_name,
  MAX(CASE WHEN meta_key = '_some_other_attribute' THEN meta_value ELSE NULL END) AS _some_other_attribute,
  MAX(CASE WHEN meta_key = '_another_attribute' THEN meta_value ELSE NULL END) AS _another_attribute,
  ...
  ...
FROM wp_post_meta
GROUP BY post_id

ステートメントは、プルするパラメーターを決定し、CASEそれを列に割り当てます。これらはMAX()、キーが一致しない場合に生じる NULL を単に排除するために集約でラップされ、ほぼ NULL 値を持つ複数の行ではなく、各属性の列を持つ 1 つの行に折りたたまれます。

これに失敗すると (属性のセットが予期せず変化する場合)、コードを反復処理する必要があります。それは面倒だろうけど。

PHP の場合:

PHP を使用して、取得したいメタ ポスト キーの配列がある場合は、すべての行をループして、必要な行である場合は配列meta_keyに格納できます。meta_value

// Assumes your WP query results are already stored into the array $your_db_rows

// Will hold your final processed results
$output = array();
// If you want only a specific set of meta_key names rather than all meta_key names
$keys_you_want = array('_billing_first_name','_billing_last_name','_some_other_attribute');

// Loops over the result set
foreach ($your_db_rows_array as $row) {
  // If the current row holds one of the meta_key you are looking for
  if (in_array($row['meta_key'], $keys_you_want)) {
    // Put it onto the output array using the meta_key as the array key
    $output[$row['meta_key'] = $row['meta_value'];
  }
  // Otherwise do nothing...
}
var_dump($output);

すべてを取得するには、テストと配列meta_keyを除外します。それは遭遇したすべてをに保存します。in_array()$keys_you_wantmeta_key$output

// Loops over the result set for all values of meta_key, not a specific set
foreach ($your_db_rows_array as $row) {
  // Put it onto the output array using the meta_key as the array key
  $output[$row['meta_key'] = $row['meta_value'];
}
var_dump($output);
于 2012-08-09T18:33:04.210 に答える