2014-01-05 3 views
1

Я собрал это меню в архиве, но это заставит страницу загружаться сверх медленно.Меню архива Wordpress, вызывающее медленное время загрузки

Я думаю, что преступник:

PHP

$years = $wpdb->get_col(
       "SELECT DISTINCT YEAR(post_date) 
       FROM $wpdb->posts 
       WHERE post_status = 'publish' 
       AND post_type = 'post' 
       ORDER BY post_date 
       DESC"); 

$months = $wpdb->get_col(
         "SELECT DISTINCT MONTH(post_date) 
         FROM $wpdb->posts 
         WHERE post_status = 'publish' 
         AND post_type = 'post' 
         AND YEAR(post_date) = '".$year."' ORDER BY post_date DESC"); 

Я использую эти данные, чтобы повторить список дат и почтовых подсчетов, там что-то не так с этим методом, что приводит к его быть медленным и есть лучший метод?

Цель этой функции - показать мне год и месяц, когда была почта, поэтому моя небольшая боковая панель архива.

С целью сделать что-то вроде:

foreach($years as $year){ 
//..do something 
    foreach($months as $month) { 
    //... do something 
    } 
} 

У меня есть 1507 сообщения на данный момент, и это занимает хорошие ~ 15s, чтобы загрузить страницу архива. Опять же, что-то не так с тем, как я это делаю?

+1

Сколько времени требуется для запуска этих запросов непосредственно в базе данных? Используются ли поля, которые вы используете, индексированными? – andrewsi

+0

@andrewsi Знание моей базы данных равно нулю, как проверить время запроса dabase и проиндексированы ли они? – UzumakiDev

ответ

0

В качестве косвенного ответа вы можете захотеть взглянуть на функцию wp_get_archives(), а не на собственный код.

Чтобы ответить на вашу проблему, проблема заключается в том, что ваш второй запрос вызывается один раз для каждого года, возвращаемого первым, и вы, вероятно, затем выполняете другой запрос для каждого месяца, чтобы определить количество сообщений. Вы должны сделать один запрос, который забирает все годы, месяцы и счета за один раз.

$dates = $wpdb->get_results(" 
    SELECT YEAR(post_date) AS year, MONTH(post_date) AS month, count(*) as count 
    FROM $wpdb->posts 
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    GROUP BY year, month 
    ORDER BY post_date DESC 
"); 

Вы тогда есть массив объектов, которые содержат свойства year, month и count, которые вы можете перебирать.

foreach ($dates as $date) { 
    // For example: 
    echo '<p>' . $date->month . '/' . $date->year . ': ' . $date->count . '</p>'; 
} 
+0

Понимаю, дайте мне немного времени, чтобы переустановить мой код и попытаться реализовать то, что вы предложили. Я не совсем понимаю, почему прямо сейчас, но я думаю, что была причина, почему я сделал это так, как сделал, но потом я мог бы просто быть глупым. Я вернусь позже, спасибо :) – UzumakiDev

0

Этот метод всегда будет медленным, а не масштабным. У вас нет ограничений по запросу, так что он либо должен получить все, либо запустить, пока не истечет время. Хуже всего работает 2 запроса без ограничений.

В любом случае, это плохо.

Вы должны использовать встроенные функции архивирования WordPress или пользовательские WP_Query с ограничением и разбиением на страницы.

Смежные вопросы