Существует ли способ исключить содержание из переменной сообщения, чтобы экономить на Использовании оперативной памяти?

Так, я столкнулся с тем, что похоже на проблему Использования оперативной памяти WP и ищет решение.

Единственное место у меня действительно есть эта проблема на моем сайте, со страницей Site Map, которую я пытаюсь заполнить, но решение этой проблемы могло быть универсально применено и экономить на Использовании оперативной памяти через весь сайт.

По существу эта страница Site Map, которую я имею, является списком всех posts и pages на моем сайте. Единственные элементы переменной $post, к которой я нуждаюсь в доступе на этой странице, являются заголовком и постоянной ссылкой. К сожалению, запрос я использую возвраты все сообщения со всей информацией в каждой из их переменных $post.

Следующее является примером запроса, который я использую на этой странице Site Map для сингла custom-post-type названный "продуктами" с пользовательской таксономией "дополнений" и термина "все-дополнения". Страница My Site Map имеет несколько таких запросов, но в объяснительных целях я только включаю код для этого единого запроса.

 $varArray= array(
      'post_type' => 'products',
      'post_status' => 'publish',
      'supplements' => 'all-supplements',
      'posts_per_page' => -1,
      'orderby' => 'title',
      'order' => 'ASC'
 );
 $myProducts= new WP_Query($varArray);

Значительное большинство информации сохранило в переменной $post (для моего сайта, и я предполагаю, что эта тенденция замечена для общего использования), найден в "содержании" типичное Использование оперативной памяти для моей страницы Site Map, ~140MB (сообщаемый Панелью Отладки), тогда как использование для любой другой типичной страницы на моем сайте 50-60MB. Большая разница. Вчера страница Site Map прекратила работать (WSOD), и зафиксировать его я должен был увеличить максимальную сумму RAM, которую может использовать WP. Таким образом, я увеличиваю полные необходимые системные ресурсы из-за единственной страницы.

Таким образом я прихожу к своему вопросу.

Есть ли трасса/опция где-нибудь в рамках Wordpress, который я пропускаю, который выбрал бы posts/pages как нормальный запрос, но НЕ получают содержание для полученных сообщений?

Или, альтернативно, есть ли некоторый более легкий способ для меня только захватить конкретные элементы в данном запросе (Title/Permaklink/Slug/etc...) вместо того, чтобы получить целую хижину переменной $post?

Мне кажется, что для многих приложений WP, единственное место, что "содержание" сообщения/страница обычно было бы необходимо, находится на этом page или post страница (очевидно, существуют исключения здесь), и что наличие доступа к полному содержанию для сообщений/страницы, полученных запросом на других страницах, является простым излишеством. Если существует способ постараться не загружать полное содержание для страниц списка сообщения, то существенное количество Использования оперативной памяти могло быть сохранено.

Любая справка ценилась бы.

9
02.05.2013, 19:43
4 ответа

Можно попробовать прием запросами данных сообщения непосредственно и установкой filter поле сообщения возражает против sample прежде, чем передать его get_permalink() уменьшать использование памяти.

См. get_permalink проблему использования памяти для подробного обоснования позади него.

8
19.02.2020, 22:01
  • 1
    Это решение работается отлично. Ну, после небольшого пререкания, которое является.:) Я должен был выяснить, как включать мою пользовательскую таксономию/термин в запрос, но это было огромной справкой. Страница Site Map теперь с помощью 70 МБ RAM (согласно Панели Отладки). Спасибо за большой указатель. –  Programmer Dan 03.05.2013, 01:54

Вы могли бы попытаться добавить это к своему массиву:

'nopaging' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false

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

4
19.02.2020, 22:01

Программист Dan, mah человек!

Давайте запустим Вас на пользовательском SELECT запросы с помощью $wpdb глобальный. Кодекс имеет большую запись при Отображении Сообщений с помощью Пользовательского Запроса Select. Если Вы используете setup_postdata() можно циклично выполниться через результаты, как будто Вы сидите в стандартном цикле Wordpress:

global $wpdb;

$sitemap_query = "
    SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
    FROM $wpdb->posts
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type IN ('post','supplement','another_post_type')
    ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
    ";

$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);

if( $sitemap_nodes ):
    global $post;
    foreach ( $sitemap_nodes as $post ):
        setup_postdata( $post );
        ?>

<!-- //Use standard Wordpress template tags for SELECT'd data within The Loop here -->
    <?php the_title() ?>
    <?php the_permalink() ?>

        <?php
    endforeach;
endif;

Этот запрос только вытягивает идентификаторы сообщений, Заголовки и GUID (раньше определял постоянную ссылку сообщения), абсолютно игнорируя все остальное. Это, кроме того, заказывает результаты сначала post_type затем post_title, хотя можно хотеть использовать несколько запросов для разделения типов сообщения (теоретически при маленьком хите производительности).

Очевидно, можно хотеть пропустить использование setup_postdata() и просто цикл через $sitemap_nodes, или скрипка с запросом для получения результатов, в которых Вы нуждаетесь.

Если Вы действительно звоните setup_postdata() и активируйте режим отладки, вызовы будут, вероятно, выкладывать уведомления, левые и правые относительно (сознательно) недостающая информация. Можно хотеть бросить @ перед вызовом функции подавить их после того, как Вы подтвердили, что Ваш пользовательский запрос функционирует правильно.

Но это должно запустить Вас! Можно обратиться к следующей схеме базы данных (от страницы Database Description на Кодексе) для определения местоположения полей, которые необходимо запросить:

Wordpress Database Diagram

Править:

Большая часть эффективного решения памяти является вероятным, которое комбинирует пользовательское SELECT запрос с проподсказкой @Rarst :)

2
19.02.2020, 22:01

WP_Query имеет "полевую парамать" возврата, которая похожа на это:

$args = array(
 'fields' => 'ids'
);
$query = new WP_Query( $args );

При использовании этот путь WP_Query только возвращает идентификаторы сообщения, не весь объект сообщения. Затем можно просто использовать get_permalink(), get_the_title(), и другой различный WordPress функционирует для получения на основе содержимого на идентификаторе сообщения.

1
19.02.2020, 22:01
  • 1
    Обратите внимание, что функционирует, которые принимают идентификатор сообщения, обычно просто сразу выполненный get_post() на нем, чтобы получить полные данные и так полностью победить цель получить одни только идентификаторы. –  Rarst 07.05.2013, 23:18
  • 2
    Хороший для знания! У меня создалось впечатление, я был умен. –  Dalton 07.05.2013, 23:29

Теги

Похожие вопросы