Có cách nào để loại trừ nội dung khỏi biến bài đăng để tiết kiệm sử dụng RAM không?


9

Vì vậy, tôi đã gặp phải vấn đề giống như sử dụng RAM WP và đang tìm giải pháp.

Nơi duy nhất tôi thực sự gặp vấn đề này trên trang web của mình là trang Site Map mà tôi đang cố gắng tạo ra, nhưng một giải pháp cho vấn đề này có thể được áp dụng phổ biến và tiết kiệm sử dụng RAM trên toàn bộ trang web.

Về cơ bản, trang Sơ đồ trang web này tôi có là một danh sách tất cả postspagestrên trang web của tôi. Các yếu tố duy nhất của biến $ post mà tôi cần truy cập trên trang này là tiêu đề và permalink. Thật không may, truy vấn tôi đang sử dụng trả về tất cả các bài đăng với tất cả thông tin trong mỗi biến $ post của họ.

Sau đây là một ví dụ về truy vấn tôi đang sử dụng trên trang Sơ đồ trang web này cho một custom-post-type"sản phẩm" có tên duy nhất với phân loại tùy chỉnh là "bổ sung" và thuật ngữ "tất cả bổ sung". Trang Sơ đồ trang web của tôi có nhiều truy vấn như vậy, nhưng với mục đích giải thích, tôi chỉ bao gồm mã cho truy vấn này.

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

Phần lớn thông tin được lưu trong biến $ post (cho trang web của tôi và tôi đoán rằng xu hướng này được nhìn thấy cho sử dụng chung) được tìm thấy trong "nội dung" Mức sử dụng RAM thông thường cho trang Bản đồ trang web của tôi là ~ 140MB (được báo cáo bởi Debug Bar), trong khi việc sử dụng cho bất kỳ trang điển hình nào khác trên trang web của tôi là 50-60 MB. Sự khác biệt lớn. Hôm qua, trang Sơ đồ trang web đã ngừng hoạt động (WSOD) và để khắc phục nó, tôi đã phải tăng dung lượng RAM tối đa mà WP có thể sử dụng. Vì vậy, tôi đang tăng tổng tài nguyên hệ thống cần thiết vì một trang duy nhất.

Vì vậy, tôi đi đến câu hỏi của tôi.

Có một con đường / tùy chọn nào đó trong Wordpress mà tôi đang thiếu có thể tìm nạp posts/ pagesnhư một truy vấn bình thường, nhưng KHÔNG lấy nội dung cho các bài đăng được truy xuất không?

Hoặc, thay vào đó, có cách nào dễ dàng hơn để tôi chỉ lấy các phần tử cụ thể trong một truy vấn nhất định (Tiêu đề / Permaklink / Slug / vv ...) thay vì lấy toàn bộ biến $ post shebang?

Đối với tôi, đối với nhiều ứng dụng WP, nơi duy nhất "nội dung" của bài đăng / trang thường cần là trên trang pagehoặc posttrang đó (rõ ràng có ngoại lệ ở đây) và có quyền truy cập vào toàn bộ nội dung cho bài đăng / trang được truy xuất bằng truy vấn trên các trang khác là quá mức đơn giản. Nếu có một cách để tránh tải lên toàn bộ nội dung cho các trang danh sách bài đăng, thì có thể lưu một lượng đáng kể sử dụng RAM.

Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


8

Bạn có thể thử một mẹo với truy vấn trực tiếp dữ liệu bài đăng và thiết lập filtertrường của các đối tượng bài đăng sampletrước khi chuyển nó get_permalink()để giảm mức sử dụng bộ nhớ.

Xem vấn đề sử dụng bộ nhớ get_permalink để biết lý do chi tiết đằng sau nó.


Giải pháp này đã làm việc tuyệt vời. Vâng, sau một chút lộn xộn đó là. :) Tôi đã phải tìm ra cách đưa phân loại / thuật ngữ tùy chỉnh của mình vào truy vấn, nhưng đây là một trợ giúp rất lớn. Trang Sơ đồ trang web hiện đang sử dụng 70 MB RAM (theo Debug Bar). Cảm ơn con trỏ tuyệt vời.
Lập trình viên Dan

4

Bạn có thể thử thêm phần này vào mảng của mình:

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

Có vẻ như nó khá tự giải thích, nhưng về cơ bản, bạn không truy vấn tất cả các biến bài đăng và chỉ những thứ bạn cần.


2

Lập trình viên Dan, người đàn ông mah!

Hãy để bạn bắt đầu với các SELECTtruy vấn tùy chỉnh bằng cách sử dụng $wpdbtoàn cầu. Codex có một mục tuyệt vời về Hiển thị bài viết bằng Truy vấn chọn tùy chỉnh . Nếu bạn sử dụng, setup_postdata()bạn có thể lặp qua các kết quả như thể bạn đang ngồi trong vòng lặp Wordpress tiêu chuẩn:

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;

Truy vấn này chỉ lấy ID, tiêu đề và GUID của bài đăng (được sử dụng để xác định permalink của bài đăng) trong khi hoàn toàn bỏ qua mọi thứ khác. Nó hơn nữa lệnh kết quả đầu tiên bởi post_typesau đó post_title, mặc dù bạn có thể muốn sử dụng nhiều truy vấn để phân biệt các loại bài viết của bạn (về mặt lý thuyết tại một buổi biểu diễn hit nhỏ).

Rõ ràng bạn có thể muốn bỏ qua việc sử dụng setup_postdata()và chỉ cần lặp qua $sitemap_nodes, hoặc tìm hiểu các truy vấn để có được kết quả mà bạn cần.

Nếu bạn thực hiện cuộc gọi setup_postdata()và kích hoạt chế độ gỡ lỗi, các cuộc gọi có thể sẽ đưa ra các thông báo trái và phải liên quan đến thông tin bị thiếu (cố ý). Bạn có thể muốn ném một lệnh @trước khi gọi hàm để chặn chúng sau khi bạn đã xác nhận rằng truy vấn tùy chỉnh của bạn đang hoạt động đúng.

Nhưng điều này sẽ giúp bạn bắt đầu! Bạn có thể tham khảo sơ đồ cơ sở dữ liệu sau (từ trang Mô tả cơ sở dữ liệu trên Codex) để tìm các trường mà bạn cần truy vấn:

Sơ đồ cơ sở dữ liệu Wordpress

BIÊN TẬP:

Giải pháp hiệu quả nhất về bộ nhớ có thể là giải pháp kết hợp SELECTtruy vấn tùy chỉnh với protip của @ Rarst :)


1

WP_Query có một tham số "trường trả về" trông như thế này:

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

Khi được sử dụng theo cách này, WP_Query chỉ trả về ID bài đăng, không phải toàn bộ đối tượng bài đăng. Sau đó, bạn chỉ có thể sử dụng get_permalink(), get_the_title()và các chức năng loại WordPress khác để lấy nội dung của bạn dựa trên các bài ID.


1
Lưu ý rằng các chức năng chấp nhận ID của bài đăng thường ngay lập tức chạy get_post()trên nó để lấy dữ liệu đầy đủ và do đó hoàn toàn đánh bại mục đích lấy ID một mình.
Hết

1
Tốt để biết! Tôi đã có ấn tượng rằng tôi đã được thông minh.
Dalton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.