首先,让我们从清理上面的查询开始。我把它放进了Heredoc 语法使其更易于阅读。
$sql = <<<SQL
SELECT *
FROM {$tablename} -- you should use interpolation when working in a string that can have variables
WHERE
( -- Your query will only ever match one row of meta_key at a time, so combine these and OR them
meta_key = \'_child_name\' -- changed LIKE to = since you\'re not doing a wildcard match
OR
meta_key LIKE \'%_child_name_%\'
)
AND -- you only need to check against this once
meta_value LIKE \'%{$s_query}%\'
LIMIT 0,100;
SQL;
$results = $wpdb->get_results( $sql );
浏览评论:
WordPress编码标准建议使用{}
执行此操作时使用括号string interpolation 在中使用变量时""
双引号或Heredoc语法您要查询的meta_key = \'_child_name\'
和meta_key LIKE \'%_child_name_%\'
. 因为SQL每次匹配只能返回一行meta_key
, 我把这些放在一个条件下OR
\'d他们你在做什么meta_key LIKE \'_child_name\'
- 因为你没有匹配通配符(%
), 这个LIKE
是多余的你有meta_value LIKE \'%$s_query%\'
两次,你只需要做一次,因为你一次只能得到一行匹配(例如meta_value = \'A\' AND meta_value = \'B\'
将始终返回零结果)。还请注意中使用的插值{}
在这里还有一点需要注意的是,WordPress的编码标准也会鼓励您使用以下方法正确地避开查询esc_like
或$wpdb->prepare()
, 但这超出了这个答案的范围。
按Post类型限制Post元数据行通过Post ID与Post表相关,以便将结果限制为shop-subscription
岗位类型,我们可以JOIN
posts表如下所示:
SELECT *
FROM {$tablename}
JOIN wp_posts p ON (p.post_type = \'shop-subscription\' AND p.ID = wp_postmeta.post_id)
WHERE
(
meta_key = \'_child_name\'
OR
meta_key LIKE \'%_child_name_%\'
)
AND
meta_value LIKE \'%{$s_query}%\'
LIMIT 0,100;
这假设您正在从
wp_postmeta
表(作为
$tablename
). 如果您使用的是不同的表,那么应该正确更新查询以将post ID与meta row ID列相关联。