自定义搜索仪表板小部件

时间:2021-03-04 作者:builtbymonkey

我有一个自定义仪表板,可以根据元值进行搜索。它工作正常,只是我现在需要将结果/搜索限制为特定的帖子类型,shop-subscription.

这是我的查询,我要找的是帮助添加对帖子类型的检查。

$results = $wpdb->get_results( "SELECT * FROM $tablename WHERE meta_key LIKE \'_child_name\'  AND meta_value LIKE \'%$s_query%\' OR meta_key LIKE \'%_child_name_%\' AND meta_value LIKE \'%$s_query%\' LIMIT 0,100;");

1 个回复
最合适的回答,由SO网友:phatskat 整理而成

首先,让我们从清理上面的查询开始。我把它放进了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列相关联。