传递一个逗号划定列表,自定义WordPress的查询
问题描述:
好了,所以这里是怎么回事...传递一个逗号划定列表,自定义WordPress的查询
我拉从谷歌Analytics(分析)最热门的帖子标题的列表,我把他们在阵列
$thisnumber = 0;
$start = date('Y-m-d', (time() - (60 * 60 * 24 * 30)));
$end = date('Y-m-d');
$limit = $getnumber;
$titles = array();
$login = new GADWidgetData();
$ga = new GALib($login->auth_token, $login->account_id, 60);
$pages = $ga->pages_for_date_period($start, $end);
foreach($pages as $page) :
$title = $page['children']['value'];
$titlearray = explode(' |', $title, -1);
$titlesub = implode("", $titlearray);
$thetitles[] = $titlesub;
$thisnumber++;
if($thisnumber > ($getnumber*2)) break;
endforeach;
$titles_list = implode(",", $thetitles);
所以经过这一切我留下既是在$ thetitles冠军的阵列和存储在$ titles_list
现在我需要所有这些标题发送到标题的列表完整的WordPress的查询 - 所以我有一个功能:
function get_post_by_title($page_title, $output = OBJECT) {
global $wpdb;
$post = $wpdb->get_var($wpdb->prepare("
SELECT wposts.*
FROM $wpdb->posts wposts
WHERE post_title = %s
AND post_type='post'
AND post_status = 'publish'", $page_title));
if ($post)
return get_post($post, $output);
return null;
}
不幸的是,这可能是一堆的查询,并在交通繁忙的网站,这可能陷入下来。我试图使用SQL IN功能,但我认为我做错了
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE post_title IN ($titles_list)
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'";
$pageposts = $wpdb->get_results($querystr, OBJECT);
任何人都可以用更好的SQL/Wordpress foo给我一只手吗?
答
当使用SQL时,参数注入不能用于IN逗号分隔列表 - 它只适用于该列表中的一个值。您需要将SQL语句创建为预准备语句语法之外的字符串,其中包括$ titles_list并置。
答
好吧,我想回来,并给大家我的解决方案...
$titles_list = implode("', '", $thetitles);
$order_by_results = build_order($thetitles);
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts
WHERE post_title IN ('" . $titles_list . "')
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'
ORDER BY CASE post_title " . $order_by_results ."
LIMIT ".$getnumber;
的build_order()函数从我最初的名单会从$ thetitles并用
WHEN 'n[1]' THEN 1
WHEN 'n[2]' THEN 2
ELSE 3 END
其格式化
图案,该功能在这里:
function build_order($titlelist) {
$order_counter = 1;
$row = array();
foreach($titlelist as $title) :
$row[] = "WHEN '" . $title . "' THEN " . $order_counter;
$order_counter++;
endforeach;
$row[] = "ELSE " . $order_counter . " END";
$title_order = implode(" ", $row);
if (title_order)
return $title_order;
}
希望这会帮助别人在未来
甜了!感谢您的帮助 改为: “ \t SELECT * wposts \t FROM $ wpdb->帖子wposts \t WHERE POST_TITLE IN('” $ querystr = \t AND wposts.post_status = $ titles_list“。”) 'publish' \t AND wposts.post_type ='post'“; 非常棒! – Shastapete 2010-07-14 23:27:05