0

次のコードを使用して、WordPress ドロップダウン メニューにカスタム フィールドのすべての一意の値を設定しています。

<form name="search" action="" method="get">
 <select name="stateprov">
 <option>Select...</option>
 <?php
 $metakey = 'state_prov';  
 statesProvs = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
 if ($statesProvs) {
 foreach ($statesProvs as $stateprov) {
  echo "<option value=\"" . $stateprov . "\">" . $stateprov . "</option>";
   }
 }
 ?>
 </select>

 <input type="submit" value="search" />
</form>

ただし、DB からは何も取得しないため、ポップアップ リストは空です。

次のような別のクエリを試す

$statesProvs = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_author = 2" );

期待どおりに動作します。たくさんの投稿 ID を含むポップアップが表示されます。しかし、私のカスタム メタデータで動作するはずのクエリは、空のメニューを表示するだけです (そして、print_r は空の配列を明らかにします)。

データは間違いなくDBにあります...何が間違っていますか?

また、カスタム作成されたすべてのフィールド キーと値を _custom_meta メタキーの値に書き込むカスタム メタボックス PHP クラスを使用していることも重要です。私がそれを正しく言えば。したがって:

a:61:{s:10:"state_prov";s:2:"CA";s:13:"vertical_drop";s:13:"3100ft / 945m";s:14:"base_elevation";s:14:"7953ft / 2424m";s:16:"summit_elevation";s:15:"11053ft / 3369m";s:12:"skiable_area";s:10:"3500 acres";s:16:"average_snowfall";s:14:"400in / 1016cm";s:13:

カスタムメタデータを保存するこの方法は、wpdbが適切にアクセスするのを妨げていますか?

ありがとう!

4

2 に答える 2

0

カスタムメタデータを保存するこの方法は、wpdbが適切にアクセスするのを妨げていますか?

はい。

一般に、Wordpress はシリアライズされた PHP 配列を検索したり並べ替えたりすることができません。

ここで最も実行可能な解決策は、このデータ ポイント ('state_prov') を独自のカスタム フィールドに格納することです。これにより、$wpdb を使用して自然に検索と並べ替えができるようになります。また、このカスタム フィールドを非公開/非表示にしたいようです。その場合は、アンダースコアを前に付けたいと思うでしょう: '_state_prov'.

上記がニーズに合わないと仮定した場合の別のオプションは、MySQL 文字列関数を使用することです。しかし、これは理想的または最適化されたものとはほど遠いものです (特にデータベースが大幅に拡大する場合)。

// Assuming all state_prov are exactly 2 characters in length
$identifier = 's:10:"state_prov";s:2:"';
$identifier_length = strlen($identifier);
$wpdb->get_col($wpdb->prepare("SELECT DISTINCT(SUBSTR(`meta_value`, INSTR(`meta_value`, '$identifier')+$identifier_length, 2)) as `state_prov` FROM $wpdb->postmeta WHERE `meta_key`=%s ORDER BY `state_prov` ASC", $metakey) );
于 2013-09-05T10:25:49.810 に答える
0

global $wpdbwpquery を開始する前に使用する必要があります。詳細についてはcodexを参照してください

<form name="search" action="" method="get">
 <select name="stateprov">
 <option>Select...</option>
 <?php
 global $wpdb;
 $metakey = 'state_prov';  
 $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
 if ($statesProvs) {
 foreach ($statesProvs as $stateprov) {
  echo "<option value=\"" . $stateprov . "\">" . $stateprov . "</option>";
   }
 }
 ?>
 </select>

 <input type="submit" value="search" />
</form>
于 2013-09-05T05:50:10.217 に答える