1. Đặt truy vấn trước khi WP_Query chạy
Đây dường như là điều quan trọng nhất cần ghi nhớ khi cố gắng giữ các truy vấn cơ sở dữ liệu ở mức tối thiểu vì cơ hội duy nhất để thay đổi truy vấn là, tất nhiên, trước khi nó được chạy trong cơ sở dữ liệu SQL.
Truy vấn thông thường
Đối với một truy vấn bình thường, WordPress sử dụng wp()
chức năng, lần lượt gọi $wp->main( $query_vars )
. "Biến is_" từ các thẻ có điều kiện được đặt trước khi chuyển chúng sang WP_Query->get_posts()
, nó chuyển đổi nó thành truy vấn cơ sở dữ liệu MySQL và cuối cùng lưu trữ chúng trong đối tượng $ wp_query. Có thể lọc truy vấn trước khi nó thực sự chạy trong cơ sở dữ liệu SQL .
Các pre_get_posts
hành động móc vào quá trình này, cho phép bạn thay đổi các truy vấn trước khi nó được chuyển cho WP_Query->get_posts()
.
Ví dụ: nếu bạn muốn lọc truy vấn cho các bài đăng trong danh mục "đặc trưng", bạn sẽ sử dụng add_action( 'pre_get_posts', 'your_function_name' );
và bao gồm in_category
thẻ điều kiện bên trong your_function_name
.
function your_function_name( $query ) {
if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
// Replace 123 with the category ID of the featured category.
$query->set( 'cat', '123' );
}
}
add_action( 'pre_get_posts', 'your_function_name' );
Xem API Plugin / Tham chiếu hành động / đăng bài trước «Codex WordPress
Yêu cầu trang
Đối với các mẫu trang, chẳng hạn như trang lưu trữ cho danh mục "đặc trưng", các thẻ có điều kiện sẽ không hoạt động từ pre_get_posts
bộ lọc. Ví dụ: bạn không thể sử dụng is_category
để kiểm tra trang lưu trữ vì WP_Query chưa chạy.
Thay vào đó, bạn sẽ phải thay đổi truy vấn chính cho các yêu cầu trang với new WP_Query
giao diện giống như thế $query = new WP_Query( 'cat=123' );
. Điều này chạy truy vấn với các đối số thích hợp được đặt từ đầu.
Xem Tham khảo lớp / Truy vấn WP «Codex WordPress
2. Lưu vào cơ sở dữ liệu
Bạn có thể sử dụng bộ lọc wp_insert_post_data
đảm bảo rằng chỉ có dữ liệu $ có liên quan đến loại bài đăng tùy chỉnh của bạn được trả về wp_insert_post
. Hãy chắc chắn bao gồm một tuyên bố có điều kiện để kiểm tra loại bài đăng tùy chỉnh của bạn.
Plugin API / Tham chiếu bộ lọc / wp chèn dữ liệu bài đăng «Codex WordPress
Móc này được gọi bởi wp_insert_post
hàm, được gọi bởi wp_update_post khi bạn cập nhật loại bài đăng tùy chỉnh của mình, thường bằng cách lưu một bản nháp hoặc xuất bản bài đăng.
Bạn sẽ phải tự chuẩn hóa nó vì tôi không thể nói về ý nghĩa tối ưu hóa của việc giảm dữ liệu được cập nhật trong cơ sở dữ liệu.
3. Các loại bài tùy chỉnh có ảnh hưởng đến hiệu suất?
Theo kinh nghiệm của tôi, các loại bài đăng tùy chỉnh là một công cụ mạnh mẽ để quản lý nội dung. Tôi không biết cách nào khác để quản lý bài đăng theo tất cả các cách mà nó cho phép theo cách sử dụng ít tài nguyên hơn. Cá nhân tôi sẽ tập trung vào việc tìm cách giảm số lượng truy vấn được thực hiện bất cứ khi nào có thể.
Đã từng có một vấn đề về hiệu suất liên quan đến cấu trúc permalink khiến nó bị ảnh hưởng khi bắt đầu bằng văn bản thay vì số. 3 Điều này đặc biệt rắc rối đối với các trang web lưu trữ một số lượng lớn trang, nhưng đã được giải quyết kể từ phiên bản WordPress 3.3.
Tôi chỉ đưa ra permalinks ở đây vì sên thường là phần đầu tiên của cấu trúc permalink có thể có hoặc không ảnh hưởng đến hiệu suất trước phiên bản 3.3. Ngoài ra, tôi không biết về bất kỳ vấn đề hiệu suất nào phát sinh từ việc sử dụng các loại bài đăng tùy chỉnh.
Tùy chọn hiệu suất khác
Transents
Đây không phải là sự thay thế để giữ các truy vấn ở mức tối thiểu trong mã của bạn, nhưng bạn có thể sử dụng set_transient để lưu trữ các truy vấn trong một thời gian để các truy vấn mới không cần thiết. Dưới đây là ví dụ được sử dụng trong bài viết của Dave Clements . Ngoài ra, lưu ý rằng ông khuyên nên thêm một save_post
hành động để xóa tạm thời bất cứ khi nào một loại bài đăng nhất định được cập nhật.
<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
$pttimestamp = time() + get_option('gmt_offset') * 60*60;
$its_query = new WP_Query( array(
'post_type' => 'spotlight',
'posts_per_page' => 1,
'post__not_in' => $do_not_duplicate,
'meta_query' => array(
array(
'key' => '_hpc_spotlight_end_time',
'value' => $pttimestamp,
'compare' => '>'
)
)
) );
set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
// LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
Tối ưu hóa truy vấn nhiều hơn
Thomas Griffin có một vài mẹo hay trong hướng dẫn Tối ưu hóa Truy vấn WordPress của mình . Dưới đây là danh sách ngắn gọn những gợi ý của anh ấy:
Đặt 'cache_results' => false
trong các truy vấn một lần nếu máy chủ của bạn không sử dụng bộ đệm ẩn liên tục như Memcached. Truy vấn một lần được mô tả là "truy vấn được sử dụng để hiển thị một lượng nhỏ dữ liệu. Có thể là bạn chỉ muốn hiển thị tiêu đề bài đăng được liên kết liên quan đến bài đăng hiện tại hoặc bạn có thể muốn hiển thị danh sách bài đăng thả xuống để chọn một thiết lập tùy chọn cụ thể. "
Ví dụ của anh ấy: $query = get_posts( array( 'posts_per_page' => 1,
'cache_results' => false ) );
Đặt 'no_found_rows' => true
nơi không cần phân trang. Điều này sẽ "bỏ qua MySQL đếm kết quả để xem chúng ta có cần phân trang hay không."
Ví dụ của anh ấy: $query = new WP_Query( array( 'posts_per_page' => 1,
'no_found_rows' => true ) );
Truy vấn cho bài ID duy nhất nếu điều này là tất cả các bạn cần 'fields' => 'ids'
trong get_posts
. Điều này sẽ làm giảm đáng kể lượng dữ liệu được trả về, khá nhiều trên mỗi bài đăng nếu bạn xem
Mô tả cơ sở dữ liệu «WordPress Codex
Ví dụ của anh ấy: $query = get_posts( array( 'posts_per_page' => 1,
'fields' => 'ids' ) );
Ngoài mẹo cuối cùng đó, lý do tương tự có thể được áp dụng khi bạn chỉ cần một hoặc một vài trường đăng bài bằng cách sử dụng get_post_field .
Có một sự hiểu biết vững chắc về cách hoạt động của truy vấn là điều cần thiết. Bạn càng có thể cụ thể hơn với các truy vấn của mình, bạn sẽ càng yêu cầu ít công việc hơn từ cơ sở dữ liệu SQL của mình. Điều này có nghĩa là có rất nhiều khả năng để quản lý các truy vấn cơ sở dữ liệu. Hãy cẩn thận với các truy vấn tùy chỉnh ở nơi chúng chạy (có phải là trang quản trị không?), Sử dụng vệ sinh đúng cách trong các truy vấn trực tiếp và thử sử dụng các chức năng WordPress gốc nơi nó cho phép bạn đạt được hiệu suất tương tự.