2010-07-14 62 views
0

好了,所以这里是怎么回事...传递一个逗号划定列表,自定义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给我一只手吗?

回答

0

当使用SQL时,参数注入不能用于IN逗号分隔列表 - 它只适用于该列表中的一个值。您需要将SQL语句创建为预准备语句语法之外的字符串,其中包括$ titles_list并置。

+0

甜了!感谢您的帮助 改为: “ \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

0

好吧,我想回来,并给大家我的解决方案...

$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; 
} 

希望这会帮助别人在未来