Чи є спосіб виключити вміст із змінної публікації, щоб заощадити на використанні оперативної пам’яті?


9

Отже, я зіткнувся з тим, що схоже на проблему використання оперативної пам'яті WP і шукаю рішення.

Єдине місце, на якому я справді маю цю проблему на своєму сайті, - це сторінка «Карта сайту», яку я намагаюся заповнити, але рішення цієї проблеми можна було б застосувати універсально і заощадити на використанні оперативної пам’яті на всьому сайті.

По суті, ця сторінка, на якій я маю сторінку Сайту, - це перелік усіх postsта pagesна моєму сайті. Єдиними елементами змінної $ post, до яких мені потрібен доступ на цій сторінці, є назва та постійна посилання. На жаль, запит, який я використовую, повертає всі повідомлення з усією інформацією в кожній зі змінних $ post.

Нижче наведено приклад запиту, який я використовую на цій сторінці Карти сайту для одного custom-post-type назви "товари" із власною систематикою "добавки" та терміном "усі добавки". На сторінці "Моя карта сайту" є кілька таких запитів, але для пояснення я включаю лише код для цього одного запиту.

 $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 (для мого сайту, і я припускаю, що ця тенденція сприймається для загального використання), знаходиться в межах "вмісту". Типове використання оперативної пам'яті для моєї сторінки "Карта сайту" становить ~ 140 МБ (повідомляється у програмі Debug Bar), тоді як використання будь-якої іншої типової сторінки на моєму сайті становить 50-60 Мб. Велика різниця. Вчора сторінка «Карта сайту» перестала працювати (WSOD), і щоб її виправити, мені довелося збільшити максимальну кількість оперативної пам’яті, яку може використовувати WP. Тому я збільшую загальні необхідні системні ресурси через одну сторінку.

Таким чином, я приходжу до свого питання.

Чи є шлях / варіант десь у Wordpress, який мені не вистачає, який би отримати posts/ pagesяк звичайний запит, але НЕ отримувати вміст для отриманих публікацій?

Або, альтернативно, чи є для мене якийсь простіший спосіб лише захопити певні елементи в межах заданого запиту (Title / Permaklink / Slug / тощо ...) замість того, щоб отримати весь шеббанг змінної $ post?

Мені здається, що для багатьох додатків WP єдине місце, яке, як правило, потрібне "вміст" публікації / сторінки, - це на тій pageчи postсторінці (очевидно, тут є винятки), і це доступ до повного вмісту для публікацій / сторінки, отримані за допомогою запиту на інших сторінках, є простою надмірністю. Якщо є спосіб уникнути завантаження повного вмісту для сторінок списку публікацій, значну кількість використання оперативної пам’яті можна зберегти.

Будь-яка допомога буде вдячна.

Відповіді:


8

Ви можете спробувати хитрість із запитом даних про публікацію безпосередньо та встановленням filterполя об’єктів публікації, sampleперш ніж передавати їх, get_permalink()щоб зменшити використання пам'яті.

Дивіться проблему використання пам'яті get_permalink, щоб отримати докладні міркування.


Це рішення спрацювало чудово. Ну, після невеликої суперечки, що є. :) Мені довелося розібратися, як включити мою власну таксономію / термін до запиту, але це була величезна допомога. Сторінка Карта сайту тепер використовує 70 Мб оперативної пам’яті (згідно з програмою Debug Bar). Дякую за чудовий вказівник.
програміст Дан

4

Ви можете спробувати додати це до масиву:

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

Це здається досить зрозумілим, але по суті ви не запитуєте всі змінні публікації та лише потрібні речі.


2

Програміст Ден, ма!

Давайте розпочнемо з користувацьких SELECTзапитів за допомогою $wpdbглобальних. Кодекс має чудовий запис щодо відображення публікацій за допомогою користувацького вибору запиту . Якщо ви користуєтесь, 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()та увімкнули режим налагодження, виклики, ймовірно, будуть виплювати повідомлення ліворуч та право щодо (навмисно) відсутньої інформації. Ви можете запустити @перед викликом функції, щоб придушити їх після того, як ви підтвердите, що ваш власний запит функціонує належним чином.

Але з цього слід розпочати! Ви можете звернутися до наступної схеми бази даних (на сторінці Опис бази даних на Codex), щоб знайти поля, які потрібно запитувати:

Діаграма бази даних Wordpress

Редагувати:

Найімовірніше рішення в пам’яті, мабуть, таке, яке поєднує в собі користувацький SELECTзапит із @ Rarst's protip :)


1

WP_Query має параметр "Поля повернення", який виглядає приблизно так:

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

При використанні цього способу WP_Query повертає лише ідентифікатори публікації, а не весь об'єкт публікації. Тоді ви можете просто використовувати get_permalink(), get_the_title()і інші функції сортували WordPress , щоб отримати контент на основі поштового ідентифікатора.


1
Зауважте, що функції, які приймають ідентифікатор допису, зазвичай просто негайно запускаються get_post()на ньому для отримання повних даних і так повністю перемагають мету отримання ідентифікаторів лише.
Рарст

1
Добре знати! Я був під враженням, що я розумний.
Далтон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.