Czy istnieje sposób na wykluczenie zawartości ze zmiennej post, aby zaoszczędzić na zużyciu pamięci RAM?


9

Natknąłem się więc na problem z używaniem WP RAM i szukam rozwiązania.

Jedynym miejscem, w którym naprawdę mam ten problem na mojej stronie, jest strona mapy witryny, którą próbuję wypełnić, ale rozwiązaniem tego problemu może być uniwersalne zastosowanie i oszczędność pamięci RAM w całej witrynie.

Zasadniczo ta strona mapy witryny, którą mam, jest listą wszystkich postsi pagesna mojej stronie. Jedynymi elementami zmiennej $ post, do których potrzebuję dostępu na tej stronie, są tytuł i bezpośredni link. Niestety zapytanie, którego używam, zwraca wszystkie posty ze wszystkimi informacjami w każdej z ich zmiennych $ post.

Poniżej znajduje się przykład zapytania, którego używam na tej stronie mapy witryny dla pojedynczego produktu o custom-post-typenazwie „produkty” z niestandardową taksonomią „suplementów” i terminem „wszystkie suplementy”. Na mojej stronie mapy witryny jest wiele takich zapytań, ale w celach wyjaśniających podaję tylko kod dla tego pojedynczego zapytania.

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

Zdecydowana większość informacji zapisanych w zmiennej $ post (dla mojej witryny i zgaduję, że ten trend jest widoczny dla ogólnego użytku) znajduje się w „treści”. Typowe użycie pamięci RAM dla mojej strony mapy witryny wynosi ~ 140 MB (zgłaszane przez pasek debugowania), podczas gdy użycie każdej innej typowej strony w mojej witrynie wynosi 50-60 MB. Duża różnica. Wczoraj strona Mapa witryny przestała działać (WSOD) i aby to naprawić musiałem zwiększyć maksymalną ilość pamięci RAM, którą WP może użyć. Zwiększam więc ogólne niezbędne zasoby systemowe z powodu jednej strony.

W ten sposób dochodzę do mojego pytania.

Czy jest gdzieś w Wordpressie ścieżka / opcja, której brakuje, która mogłaby pobrać posts/ pagesjak normalne zapytanie, ale NIE pobierać treści dla pobranych postów?

Czy też jest jakiś łatwiejszy sposób, aby pobrać tylko określone elementy w ramach danego zapytania (Title / Permaklink / Slug / etc ...) zamiast uzyskać cały shebang zmiennej $ post?

Wydaje mi się, że dla wielu zastosowań WP, jedynym miejscem, że „content” z post / strona będzie zazwyczaj potrzebny jest na to pageczy poststrona (oczywiście są wyjątki tutaj), i że mając dostęp do pełnej treści dla stanowisk / strony pobrane przez zapytanie na innych stronach to zwykła nadmiar. Jeśli istnieje sposób na uniknięcie ładowania pełnej zawartości stron list wpisów, można zaoszczędzić znaczną ilość pamięci RAM.

Każda pomoc będzie mile widziana.

Odpowiedzi:


8

Możesz wypróbować sztuczkę z bezpośrednim zapytaniem o dane postu i ustawieniem filterpola obiektów post sampleprzed, aby je przesłać w get_permalink()celu zmniejszenia zużycia pamięci.

Zobacz problem użycia pamięci get_permalink, aby uzyskać szczegółowe uzasadnienie.


To rozwiązanie działało świetnie. Cóż, po tym trochę kłótni. :) Musiałem wymyślić, jak dołączyć niestandardową taksonomię / termin do zapytania, ale to była ogromna pomoc. Strona Mapa witryny używa teraz 70 MB pamięci RAM (zgodnie z paskiem debugowania). Dzięki za świetny wskaźnik.
programista Dan

4

Możesz spróbować dodać to do tablicy:

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

Wydaje się to dość oczywiste, ale w gruncie rzeczy nie pytasz o wszystkie zmienne wpisu i tylko o to, czego potrzebujesz.


2

Programista Dan, mah!

Zacznijmy od niestandardowych SELECTzapytań za pomocą $wpdbglobalnego. Kodeks ma świetny wpis na temat wyświetlania postów za pomocą niestandardowego zapytania Select . Jeśli skorzystasz z niego setup_postdata(), możesz przeglądać wyniki tak, jakbyś siedział w standardowej pętli 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;

To zapytanie pobiera tylko identyfikatory postów, tytuły i identyfikatory GUID (używane do określenia bezpośredniego łącza do postu), absolutnie ignorując wszystko inne. Jest ponadto zlecenia przez pierwsze rezultaty post_typewtedy post_title, choć może chcesz korzystać z wielu pytań, aby oddzielić swoje typy post (teoretycznie przy małym spadku wydajności).

Oczywiście możesz zrezygnować z używania setup_postdata()i po prostu zapętlić $sitemap_nodeslub przeszukać zapytanie, aby uzyskać potrzebne wyniki.

Jeśli wykonasz połączenie setup_postdata()i włączysz tryb debugowania, połączenia prawdopodobnie będą wyrzucać powiadomienia w lewo i w prawo dotyczące (celowo) brakujących informacji. Możesz rzucić @przed wywołaniem funkcji, aby je ukryć po potwierdzeniu, że niestandardowe zapytanie działa poprawnie.

Ale to powinno wystartować! Możesz odnieść się do następującego diagramu bazy danych (ze strony Opis bazy danych w Kodeksie), aby zlokalizować pola, które należy wysłać:

Schemat bazy danych Wordpress

EDYTOWAĆ:

Najbardziej wydajnym rozwiązaniem pod względem pamięci jest prawdopodobnie takie, które łączy niestandardowe SELECTzapytanie z protipem @ Rarst :)


1

WP_Query ma parametr „pola zwrotne”, który wygląda następująco:

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

Przy takim użyciu WP_Query zwraca tylko identyfikatory postów, a nie cały obiekt postu. Następnie można po prostu użyć get_permalink(), get_the_title()i inne funkcje dobrane WordPress odzyskać swoją treść na podstawie postu ID.


1
Pamiętaj, że funkcje, które akceptują identyfikator postu, zwykle po prostu natychmiast get_post()na nim uruchamiają , aby odzyskać pełne dane, a zatem całkowicie eliminują cel polegający na pobieraniu samych identyfikatorów.
Rarst

1
Dobrze wiedzieć! Miałem wrażenie, że jestem mądry.
Dalton,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.