我正在使用以下代码使用自定义字段中的所有唯一值填充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正确访问它?
谢谢!
答案 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) );