Apakah ada cara untuk mengecualikan konten dari variabel posting untuk menghemat penggunaan RAM?

9

Jadi, saya mengalami apa yang tampak seperti masalah penggunaan RAM WP dan saya sedang mencari solusi.

Satu-satunya tempat saya benar-benar mengalami masalah ini di situs saya adalah dengan halaman Peta Situs yang saya coba isi, tetapi solusi untuk masalah ini dapat diterapkan secara universal dan menghemat penggunaan RAM di seluruh situs.

Pada dasarnya, halaman Peta Situs ini yang saya miliki adalah daftar semua postsdan pagesdi situs saya. Satu-satunya elemen variabel $ post yang perlu saya akses di halaman ini adalah judul dan permalink. Sayangnya, kueri yang saya gunakan mengembalikan semua posting dengan semua informasi di masing-masing variabel $ post mereka.

Berikut ini adalah contoh dari kueri yang saya gunakan pada halaman Peta Situs ini untuk satu custom-post-type"produk" bernama dengan taksonomi khusus "suplemen" dan istilah "semua suplemen". Halaman Peta Situs saya memiliki beberapa pertanyaan seperti itu, tetapi untuk tujuan penjelasan saya hanya menyertakan kode untuk permintaan tunggal ini.

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

Sebagian besar informasi yang disimpan dalam variabel $ post (untuk situs saya, dan saya menduga tren ini terlihat untuk penggunaan umum) ditemukan dalam "konten" Penggunaan RAM yang khas untuk halaman Peta Situs saya adalah ~ 140MB (dilaporkan oleh Debug Bar), sedangkan penggunaan untuk halaman khas lainnya di situs saya adalah 50-60MB. Perbedaan besar. Kemarin halaman Peta Situs berhenti bekerja (WSOD), dan untuk memperbaikinya saya harus meningkatkan jumlah maksimum RAM yang dapat digunakan WP. Jadi saya meningkatkan keseluruhan sumber daya sistem yang diperlukan karena satu halaman.

Jadi, saya sampai pada pertanyaan saya.

Apakah ada jalur / opsi di suatu tempat di dalam Wordpress yang saya lewatkan yang akan mengambil posts/ pagesseperti permintaan normal, tetapi TIDAK mendapatkan konten untuk posting yang diambil?

Atau, sebagai alternatif, apakah ada cara yang lebih mudah bagi saya untuk hanya mengambil elemen tertentu dalam kueri yang diberikan (Judul / Permaklink / Slug / etc ...) daripada mendapatkan seluruh variabel $ post shebang?

Sepertinya saya bahwa untuk banyak aplikasi WP, satu-satunya tempat yang "isi" dari post / page biasanya akan diperlukan adalah pada yang pageatau posthalaman (jelas ada pengecualian di sini), dan memiliki akses ke konten penuh untuk posting / halaman diambil oleh permintaan pada halaman lain adalah pembunuhan sederhana yang sederhana. Jika ada cara untuk menghindari memuat konten lengkap untuk halaman daftar posting, maka sejumlah besar penggunaan RAM dapat dihemat.

Bantuan apa pun akan dihargai.

Programmer Dan
sumber

Jawaban:

8

Anda dapat mencoba trik dengan menanyakan data posting secara langsung dan mengatur filterbidang objek posting samplesebelum meneruskannya get_permalink()untuk mengurangi penggunaan memori.

Lihat masalah penggunaan memori get_permalink untuk alasan terperinci di baliknya.

Jarang
sumber
Solusi ini bekerja sangat baik. Nah, setelah sedikit perselisihan itu. :) Saya harus mencari cara untuk memasukkan taksonomi / istilah khusus saya ke dalam kueri, tapi ini sangat membantu. Halaman Peta Situs sekarang menggunakan 70MB RAM (menurut Debug Bar). Terima kasih atas penunjuk hebatnya.
Programmer Dan
4

Anda dapat mencoba menambahkan ini ke array Anda:

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

Tampaknya cukup jelas, tetapi pada dasarnya Anda tidak meminta semua variabel posting dan hanya hal-hal yang Anda butuhkan.

NW Tech
sumber
2

Programmer Dan, mah man!

Mari kita mulai SELECTpermintaan kustom menggunakan $wpdbglobal. Codex memiliki entri bagus tentang Menampilkan Posting menggunakan Kueri Pilih Kustom . Jika Anda memanfaatkan setup_postdata()Anda dapat mengulangi hasil seolah-olah Anda sedang duduk di loop Wordpress standar:

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;

Query ini hanya menarik ID, Judul, dan GUID posting (digunakan untuk menentukan permalink posting) sementara benar-benar mengabaikan yang lainnya. Lebih jauh lagi, itu memerintahkan hasil pertama kali pada post_typesaat itu post_title, meskipun Anda mungkin ingin menggunakan beberapa permintaan untuk memisahkan jenis posting Anda (secara teoritis pada hit kinerja kecil).

Jelas Anda mungkin ingin berhenti menggunakan setup_postdata()dan hanya mengulang $sitemap_nodes, atau mengutak-atik kueri untuk mendapatkan hasil yang Anda butuhkan.

Jika Anda benar-benar memanggil setup_postdata()dan mengaktifkan mode debug, panggilan tersebut kemungkinan besar akan mengeluarkan pemberitahuan dari kiri dan kanan tentang (yang dengan sengaja) informasi yang hilang. Anda mungkin ingin melempar @sebelum pemanggilan fungsi untuk menekan mereka setelah Anda mengonfirmasi bahwa permintaan khusus Anda berfungsi dengan baik.

Tetapi ini seharusnya membantu Anda memulai! Anda bisa merujuk ke diagram database berikut (dari halaman Deskripsi Basis Data pada Codex) untuk menemukan bidang yang perlu Anda kueri:

Diagram Basis Data Wordpress

EDIT:

Solusi paling efisien memori kemungkinan adalah solusi yang menggabungkan SELECTpermintaan khusus dengan protip @ Rarst :)

bosco
sumber
1

WP_Query memiliki parameter "bidang kembali" yang terlihat seperti ini:

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

Ketika digunakan dengan cara ini, WP_Query hanya mengembalikan ID posting, bukan seluruh objek posting. Kemudian Anda hanya dapat menggunakan get_permalink(), get_the_title()dan fungsi berbagai macam WordPress lainnya untuk mengambil konten Anda berdasarkan pos ID.

Dalton
sumber
1
Perhatikan bahwa fungsi yang menerima ID kiriman biasanya hanya langsung berjalan get_post()di atasnya untuk mengambil data lengkap dan dengan demikian sepenuhnya mengalahkan tujuan pengambilan ID saja.
Jarang
1
Senang mendengarnya! Saya mendapat kesan saya cerdas.
Dalton