WordPress категории php запрос исчерпал память? - PullRequest
3 голосов
/ 18 мая 2011

У меня есть страница WordPress, в которой есть карта недавней поездки, которую я совершил.

http://www.marksmayo.com/south-american-journey/

Если я затем напишу базовую функцию запроса php, чтобы вывести список всех сообщений вкатегория «Южная Америка 2010», она отлично работает для 4-5 сообщений, но когда я добавил сообщения в категорию, у него не хватило памяти с этим запросом (с ошибками на странице), а теперь просто не загружаетсячто-нибудь под картой.

Тот же код включен:

http://www.marksmayo.com/northern-europe-and-asia-mission/

и в настоящее время работает, но, поскольку я добавляю больше постов, которые, вероятно, тоже прекратятся.

Код:

<?php

// The Query
query_posts( array ( 'category_name' => 'south america 2010', 'posts_per_page' => -1 ) );
// The Loop
while ( have_posts() ) : the_post();
    echo '<li><a href=';
        the_permalink();
        echo'>';
    the_title();

    echo '</a></li>';
endwhile;

// Reset Query
wp_reset_query();

?>

Ответы [ 5 ]

5 голосов
/ 21 мая 2011

Две вещи: использовать более простой запрос и увеличить выделение памяти WP.

Попробуйте этот запрос , который сбрасывается и может использоваться любое количество раз пристраница (с выполнением PHP) или в шаблоне страницы.Измените имя категории и showposts на число, или -1, чтобы показать все.

<?php $my_query = new WP_Query('category_name=mycategory&showposts=10'); ?>

<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>

<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">

<?php the_title(); ?></a>

<?php endwhile; ?>

Увеличьте выделение памяти WP в wp-config.php с этим в верхней части:

define('WP_MEMORY_LIMIT', '64M');

и проверьте файл php.ini в своей учетной записи, чтобы увидеть, установлен ли предел памяти php на очень низкий предел.Вы находитесь на Bluehost, поэтому, если у вас нет файла php.ini, вы можете добавить один файл php.ini в конфигурацию php в Cpanel, а затем отредактировать его в своей учетной записи root.

Bluehost позволитстолько оперативной памяти для php, но помните, что Bluehost иногда будет душить ЦП вашей учетной записи;проверьте Cpanel на предмет загрузки вашего процессора и регулирования.

2 голосов
/ 21 мая 2011

Я бы использовал ID категории, а не slug категории, поэтому ваш запрос выглядит так:

query_posts( array ( 'cat' => 4, 'posts_per_page' => -1 ) );

(я бы предположил, что целочисленный поиск будет быстрее и менее интенсивным.) (Очевидно, заменить4 с идентификатором вашей категории).

Вы также можете удалить вызов для the_title () и заменить его на $ post-> post_title, как вы вызывали the_post (), хотя, если честно, яЯ не уверен на 100%, окажет ли это влияние.

Также, если вы пользуетесь на виртуальном хостинге, вы можете рассмотреть плагин кэширования.Я бы порекомендовал W3 Total Cache , он будет создавать плоские файлы только при выполнении этого запроса, когда содержимое действительно обновляется.

Наконец, что предшествует вашему фрагменту кода, у вас его еще нетв цикле, так что это цикл через что-то еще, И выполняется это каждый раз, не так ли?

0 голосов
/ 26 мая 2011

Еще одним незначительным дополнением, которое может помочь вашему запросу использовать меньше памяти, будет добавление к нему

no_found_rows = 1

, поскольку это поможет сократить накладные расходы на запрос.

0 голосов
/ 26 мая 2011

Даже если вы увеличите ограничение памяти в файле wp-config.php, как предлагается в отдельном ответе, вы не избежите проблемы нехватки памяти в будущем из-за чрезвычайно расточительного способа, которым $wpdb управляет памятью.(Он создает и сохраняет две копии каждой извлекаемой строки в WP 3.0, и даже это огромное улучшение по сравнению с тем, что было в более ранних версиях.)

Я бы посоветовал ограничить количествосообщений на странице, чтобы что-то более разумное, например, 50.

0 голосов
/ 21 мая 2011

Вы пытались использовать WP_Query класс?Может быть, это поможет:

// Query posts
$the_query = new WP_Query( $args );

// Loop the result
while ( $the_query->have_posts() ) : $the_query->the_post();
    // your impl
endwhile;

// Reset Post Data
wp_reset_postdata();
...