Làm cách nào để chạy truy vấn trong WordPress?
Là nhà phát triển WordPress, chúng tôi thường cần truy xuất các bài đăng, trang và nội dung khác phù hợp với tiêu chí cụ thể từ cơ sở dữ liệu WordPress. Thông thường, chúng ta không cần xây dựng các truy vấn SQL (và thường thì chúng ta không nên) vì lớp if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '0 và các phương thức của nó cung cấp cho chúng ta một cách an toàn và hiệu quả để truy xuất dữ liệu từ cơ sở dữ liệu. Chúng ta chỉ cần khai báo một mảng các đối số và đối tượng'; print_r( $wpdb->queries ); echo ''; } if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '1 sẽ xây dựng truy vấn SQL thực tế'; print_r( $wpdb->queries ); echo ''; } Show Trong bài đăng này, tôi giả định rằng bạn đã biết những kiến thức cơ bản về lớp if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '0, các phương thức và thuộc tính của nó cũng như nơi tìm danh sách các biến có sẵn'; print_r( $wpdb->queries ); echo ''; } Tôi sẽ tập trung vào các tham số do lớp if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '0 cung cấp cụ thể để tối ưu hóa các truy vấn SQL, giảm thời gian thực hiện và mức tiêu thụ tài nguyên'; print_r( $wpdb->queries ); echo ''; } Khi lưu lượng truy cập và nội dung bị hạn chế, chúng tôi thường không quan tâm đến hiệu quả của các truy vấn của mình. WordPress xây dựng các truy vấn SQL được tối ưu hóa tốt và cung cấp một hệ thống bộ nhớ đệm vượt trội Khi lưu lượng truy cập và nội dung trang web tăng lên đáng kể – lên đến hàng nghìn bài đăng – thì chúng ta phải xem xét thời gian thực hiện truy vấn Hộp công cụ của chúng tôiĐoạn mã mà tôi sắp cho bạn xem đã được thử nghiệm với Query Monitor, một plugin miễn phí cung cấp thông tin cần thiết về hiệu suất truy vấn, hook được kích hoạt, yêu cầu HTTP, quy tắc viết lại, v.v. Ngoài ra, đối với một plugin, chúng ta có thể buộc WordPress lưu trữ thông tin truy vấn khai báo hằng số sau trong wp-config. php define( 'SAVEQUERIES', true ); Khi if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '4 được đặt thành'; print_r( $wpdb->queries ); echo ''; } if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '5, WordPress đăng ký các truy vấn và một loạt thông tin hữu ích trong mảng'; print_r( $wpdb->queries ); echo ''; } if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '6. Vì vậy, tên của các hàm gọi và thời gian thực thi của mỗi truy vấn có thể được in ra bằng cách thêm đoạn mã sau vào một tệp mẫu như footer. php'; print_r( $wpdb->queries ); echo ''; } Xem kế hoạch if ( current_user_can( 'administrator' ) ) { global $wpdb; echo ''; print_r( $wpdb->queries ); echo ''; } Đây là một ví dụ về những gì được lặp lại [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 ) Nếu bạn muốn đi sâu vào chủ đề này, hãy xem hướng dẫn của chúng tôi. Chỉnh sửa wp-config. php if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '4 tích hợp đều đang phát triển các công cụ mà chúng ta nên tắt trong môi trường sản xuất'; print_r( $wpdb->queries ); echo ''; } Như đã nói, chúng ta hãy xem cách tăng tốc các truy vấn WordPress WP_Query – Tại sao chúng tôi không đếm hàngChúng ta có thể truy vấn cơ sở dữ liệu bằng hàm if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '8, hàm này trả về một mảng các bài đăng hoặc một thể hiện mới của đối tượng'; print_r( $wpdb->queries ); echo ''; } if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '0. Trong cả hai trường hợp, chúng tôi có thể xác định kết quả của các truy vấn bằng cách đặt các giá trị thích hợp cho các biến cụ thể'; print_r( $wpdb->queries ); echo ''; } Hãy bắt đầu với một ví dụ hiển thị Vòng lặp phổ biến vì nó thường xuất hiện trong tệp mẫu // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) : $the_query->the_post(); // Your code here endwhile; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata(); [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )0 là một mảng các cặp khóa/giá trị. Các cặp này được đặt tên là vars truy vấn và xác định hoặc ảnh hưởng đến truy vấn SQL thực tế Khi truy vấn cơ sở dữ liệu từ plugin, chúng tôi có thể ưu tiên sử dụng bộ lọc [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )1, như minh họa trong ví dụ sau function myplugin_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ){ return; } $query->set( 'category_name', 'webdev' ); } add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 ); Một điều quan trọng cần lưu ý ở đây là đối tượng if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '1 được truyền theo tham chiếu, không phải theo giá trị, nghĩa là các đối số truy vấn chỉ ảnh hưởng đến một thể hiện'; print_r( $wpdb->queries ); echo ''; } if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '1 hiện có'; print_r( $wpdb->queries ); echo ''; } Phương thức [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )4 thêm một truy vấn var mới vào đặc tả truy vấn và sẽ buộc WordPress truy xuất tất cả các bài đăng từ danh mục [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )5. Đây là truy vấn kết quả SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (12) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10 Trong ví dụ này, giá trị [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )6 đã được người dùng quản trị đặt trong tùy chọn Đọc, như trong hình bên dưới Triển khai ứng dụng của bạn lên Kinsta - Bắt đầu với Khoản tín dụng $20 ngay bây giờChạy nút của bạn. js, Python, Go, PHP, Ruby, Java và Scala, (hoặc hầu hết mọi ứng dụng khác nếu bạn sử dụng Dockerfiles tùy chỉnh của riêng mình), trong ba bước đơn giản Triển khai ngay bây giờ và nhận $20 giảm giáTrong các truy vấn tùy chỉnh, chúng tôi có thể đặt số lượng hàng sẽ được truy xuất từ cơ sở dữ liệu nhờ vào [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )7 Tùy chọn [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )8 buộc truy vấn đếm số lượng hàng được tìm thấy. Số này sẽ được trả về bởi hàm SQL [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )9, như minh họa trong ví dụ sau SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; SELECT FOUND_ROWS(); Thật không may, [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )8 có thể làm chậm đáng kể thời gian thực hiện truy vấn Tin vui là chúng ta có thể buộc WordPress xóa tùy chọn cung cấp biến // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) : $the_query->the_post(); // Your code here endwhile; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata();1 ít được sử dụng (và không được ghi lại) Nếu [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )8 bị bỏ qua, [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )9 trả về số lượng hàng lên đến giá trị của [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )6 (thêm về chủ đề này trên) Trong một bản cài đặt WordPress có vài trăm bài đăng, truy vấn meta sau chiếm 0. 0107 giây SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( ( wp_postmeta.meta_key = 'book_author' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%Isaac Asimov%' ) ) AND wp_posts.post_type = 'book' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10 Loại bỏ cài đặt [4] => Array ( [0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 [1] => 0.0163011550903 [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query [trace] => QM_Backtrace Object ( .. ) [result] => 10 )8 // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) : $the_query->the_post(); // Your code here endwhile; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata();1 thành false, truy vấn tương tự lấy 0. 0006 giây Đấu tranh với thời gian chết và các vấn đề về WordPress? . Kiểm tra các tính năng của chúng tôi Nhờ plugin Query Monitor, chúng ta có thể dễ dàng so sánh hai truy vấn có và không có tùy chọn SQL_CALC_FOUND_ROWSKhi bảng // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) : $the_query->the_post(); // Your code here endwhile; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata();7 chứa hàng nghìn hàng, việc thực hiện truy vấn có thể mất vài giây Khi chúng ta không cần phân trang, chúng ta nên đặt // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) : $the_query->the_post(); // Your code here endwhile; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata();1 thành if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '5, làm cho truy vấn chạy nhanh hơn đáng kể'; print_r( $wpdb->queries ); echo ''; } Lưu vào bộ đệm hoặc không lưu vào bộ đệmWordPress cung cấp một hệ thống bộ nhớ đệm tích hợp sẵn. Mặc dù bộ nhớ đệm thường cải thiện tốc độ tải trang, nhưng nó có thể khiến một số truy vấn bổ sung được chạy đối với cơ sở dữ liệu. Ngoài ra, bất cứ khi nào một truy vấn được thực thi, một loạt dữ liệu không cần thiết có thể được yêu cầu May mắn thay, WordPress cho phép chúng tôi vô hiệu hóa bộ nhớ đệm cung cấp ba
Nếu một hệ thống bộ nhớ đệm liên tục được bật, chẳng hạn như Memcached, chúng tôi không phải quan tâm đến các tham số bộ nhớ đệm vì WordPress sẽ đặt thành false các đối số này theo mặc định Trong bất kỳ tình huống nào khác, chúng ta có thể tạo truy vấn nhanh hơn bằng đoạn mã sau function myplugin_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ){ return; } $query->set( 'category_name', 'webdev' ); $query->set( 'no_found_rows', true ); $query->set( 'update_post_meta_cache', false ); $query->set( 'update_post_term_cache', false ); } add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 ); Khi không có hệ thống bộ nhớ đệm cố định, các truy vấn trả về lượng dữ liệu nhỏ sẽ không được lưu vào bộ nhớ đệm Trường trả vềTheo nguyên tắc chung, chúng ta không bao giờ nên truy vấn cơ sở dữ liệu cho các trường không cần thiết. Lớp if ( current_user_can( 'administrator' ) ) { global $wpdb; echo '0 cung cấp đối số trường, cho phép giới hạn các trường được trả về ở các trường ID hoặc'; print_r( $wpdb->queries ); echo ''; } function myplugin_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ){ return; } $query->set( 'category_name', 'webdev' ); } add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );1. Tệp nguồn xác định đối số trường như sau
Biến trường thừa nhận function myplugin_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ){ return; } $query->set( 'category_name', 'webdev' ); } add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );2 và function myplugin_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ){ return; } $query->set( 'category_name', 'webdev' ); } add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );1 và mặc định là * (bất kỳ giá trị nào khác), mặc dù bạn sẽ nhận thấy rằng theo mặc định, WordPress sẽ đặt giá trị thành id trong một số truy vấn Cuối cùng, chúng ta có thể tối ưu hóa truy vấn đầu tiên của mình true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'category_name' => 'cms', 'fields' => 'ids' ); // The Query $the_query = new WP_Query( $args ); $my_posts = $the_query->get_posts(); if( ! empty( $my_posts ) ){ foreach ( $my_posts as $p ){ // Your code } } /* Restore original Post Data */ wp_reset_postdata(); ?> Khi các trường cụ thể không bắt buộc, hãy giới hạn các trường được trả về thành ID Bản tóm tắtXem xét tốc độ truy vấn có thể không mang lại lợi thế lớn cho các trang web nhỏ với vài trăm bài đăng. Nếu bạn muốn sẵn sàng cho sự phát triển hoặc bạn đang điều hành một trang web lớn với các truy vấn đắt tiền, bạn nên tối ưu hóa các truy vấn WordPress của mình. Các truy vấn không hiệu quả có thể làm chậm quá trình tải trang nhưng với một vài điều chỉnh đơn giản, bạn có thể tăng tốc trang web của mình một cách đáng kể Nhận tất cả các ứng dụng, cơ sở dữ liệu và trang web WordPress của bạn trực tuyến và dưới một mái nhà. Nền tảng đám mây hiệu suất cao, đầy đủ tính năng của chúng tôi bao gồm
Hãy tự kiểm tra với $20 trong tháng đầu tiên của Lưu trữ ứng dụng hoặc Lưu trữ cơ sở dữ liệu. Khám phá kế hoạch của chúng tôi hoặc nói chuyện với bộ phận bán hàng để tìm thấy sự phù hợp nhất của bạn Truy vấn chính trong WordPress là gì?Hàm is_main_query() là hàm điều kiện có thể được sử dụng để đánh giá xem truy vấn hiện tại (chẳng hạn như trong vòng lặp) có phải là truy vấn “chính” hay không (as opposed to a secondary query).
Làm cách nào để tạo SQL trong WordPress?Sử dụng cPanel . Đăng nhập vào cPanel của bạn Nhấp vào biểu tượng Trình hướng dẫn cơ sở dữ liệu MySQL trong phần Cơ sở dữ liệu Ở Bước 1. Tạo cơ sở dữ liệu nhập tên cơ sở dữ liệu và nhấp vào Bước tiếp theo Ở Bước 2. Tạo cơ sở dữ liệu Người dùng nhập tên người dùng cơ sở dữ liệu và mật khẩu. . Ở Bước 3. . Ở Bước 4 |