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>

但是,它不从数据库中获取任何内容,因此弹出列表为空。

尝试不同的查询,例如

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

按预期工作。我得到一个弹出窗口,里面有一堆 Post 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 正确访问它?

谢谢!

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