$ wpdb似乎无法使用

时间:2013-09-05 04:32:06

标签: wordpress custom-post-type wpdb

我正在使用以下代码使用自定义字段中的所有唯一值填充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会显示一个空数组)。

数据肯定在数据库中...我做错了什么?

我正在使用自定义元框PHP类,将所有自定义创建的字段键和值写入_custom_meta元键的值,这也很重要。如果我说得对。因此:

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正确访问它?

谢谢!

2 个答案:

答案 0 :(得分:0)

在启动wpquery之前必须使用global $wpdb,有关详细信息,请参阅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>

答案 1 :(得分:0)

  

等。这种方式是存储防止wpdb的自定义元数据   正确访问它?

通常,Wordpress无法通过序列化的PHP数组进行搜索或排序。

这里最可行的解决方案是将此数据点('state_prov')存储在自己的自定义字段中。这将允许您使用$ wpdb自然搜索和排序。您似乎也希望此自定义字段为私有/隐藏,在这种情况下,您需要在其前面添加下划线:'_ start_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) );