передача выделенного запятой списка в пользовательский запрос WordPress - PullRequest
0 голосов
/ 15 июля 2010

Хорошо, вот что происходит ...

Я собираю список самых популярных постов из Google 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, и список заголовков, сохраненных в $ title_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);

Может ли кто-нибудь с лучшим foo для SQL / Wordpress помочь мне?

Ответы [ 2 ]

0 голосов
/ 15 июля 2010

Хорошо, я хотел вернуться и дать всем свое решение ...

$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

Pattern, эта функция здесь:

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

Надеюсь, это поможет кому-то еще в будущем

0 голосов
/ 15 июля 2010

Ввод параметра не может быть для списка IN через запятую при использовании SQL - он будет работать только для одного из значений в этом списке. Вы должны создать инструкцию SQL как строку вне подготовленного синтаксиса оператора, включая конкатенацию $ title_list.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...