Làm cách nào để ngăn việc thực hiện truy vấn mặc định, trong khi vẫn duy trì khả năng sử dụng WP_Query trong mẫu?


7

VẤN ĐỀ: Tôi đang cố gắng ngăn việc thực hiện truy vấn WordPress mặc định cho mẫu danh mục tùy chỉnh. Tôi đã tìm thấy một giải pháp khả thi, nhưng có vẻ như nó ngăn chặn việc thực hiện tất cả các truy vấn bài viết:

function _cancel_query( $query ) {
    if ( !is_admin() && !is_feed() && is_search() ) {
        $query = false;
    }
    return $query;
}
add_action( 'posts_request', '_cancel_query' );

Nguồn: http://vadimk.com/2010/05/11/disable-wordpress-search-query/

'@ query-> is_main_query ()' sẽ không hoạt động với hành động 'Post_Vquest'. Có cách nào tao nhã để ngăn chặn truy vấn WordPress mặc định CHỈ, cho phép mã của tôi xử lý việc nhận bài đăng mà không thực hiện các hoạt động vô ích?

TẠI SAO: Tôi phải nhận được các bài đăng nổi bật, sau đó cố định số lượng bài đăng bình thường mà không có nội dung trùng lặp, ngụ ý rằng truy vấn bài đăng dựa trên kết quả truy vấn nổi bật, vì không có gì đảm bảo rằng trong truy vấn bài đăng tôi tìm thấy đủ các bài đăng nổi bật để điền vào hộp đặc trưng. Và sau tất cả, tôi sẽ phải thêm phân trang AJAX - vẫn không có nội dung trùng lặp.

EDIT # 2: Nếu bạn cố gắng thực hiện WP_Query trong 'pre_get_posts' như Rarst đã đề xuất ( Cách ngăn thực hiện truy vấn mặc định, trong khi duy trì khả năng sử dụng WP_Query trong mẫu? ):

"pre_get_posts chạy trước khi WP_Query được thiết lập. Một số thẻ mẫu và các hàm điều kiện dựa trên WP_Query sẽ không hoạt động. Ví dụ, is_front_page () sẽ không hoạt động, mặc dù is_home () sẽ hoạt động trực tiếp. với các vars truy vấn, được chuyển đến hook pre_get_posts làm đối số ($ truy vấn trong ví dụ trên trang này). "

Nguồn: https://codex.wordpress.org/Class_Reference/WP_Query

WP_Query sẽ được khởi tạo ở giai đoạn này, trước truy vấn chính và để tránh kết quả như thế này (kiểm tra nhật ký), bạn phải bọc nó:

if ($query->is_main_query()) {
    $args = array();
    $query = new WP_Query( $args );
}

ĐĂNG NHẬP:

[30-Apr-2013 17:07:12 UTC] PHP Fatal error:  Maximum function nesting level of '100' reached, aborting! in C:\Users\serwis\Dropbox\www\XYZ\wp-includes\functions.php on line 2769

[30-Apr-2013 17:07:12 UTC] PHP Stack trace:

[30-Apr-2013 17:07:12 UTC] PHP   1. {main}() C:\Users\serwis\Dropbox\www\XYZ\index.php:0

[30-Apr-2013 17:07:12 UTC] PHP   2. require() C:\Users\serwis\Dropbox\www\XYZ\index.php:17

[30-Apr-2013 17:07:12 UTC] PHP   3. wp() C:\Users\serwis\Dropbox\www\XYZ\wp-blog-header.php:14

[30-Apr-2013 17:07:12 UTC] PHP   4. WP->main() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\functions.php:779

[30-Apr-2013 17:07:12 UTC] PHP   5. WP->query_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\class-wp.php:549

[30-Apr-2013 17:07:12 UTC] PHP   6. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\class-wp.php:485

[30-Apr-2013 17:07:12 UTC] PHP   7. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP   8. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP   9. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  10. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  11. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  12. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  13. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  14. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  15. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  16. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  17. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  18. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  19. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  20. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  21. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  22. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  23. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  24. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  25. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  26. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  27. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  28. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  29. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  30. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  31. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  32. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  33. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  34. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  35. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  36. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  37. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  38. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  39. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  40. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  41. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  42. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  43. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  44. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  45. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  46. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  47. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  48. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  49. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  50. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  51. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  52. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  53. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  54. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  55. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  56. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  57. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  58. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  59. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  60. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  61. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  62. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  63. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  64. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  65. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  66. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  67. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  68. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  69. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  70. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  71. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  72. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  73. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  74. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  75. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  76. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  77. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  78. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  79. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  80. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  81. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  82. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  83. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  84. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  85. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  86. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  87. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  88. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  89. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  90. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  91. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  92. do_action_ref_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1924

[30-Apr-2013 17:07:12 UTC] PHP  93. call_user_func_array() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  94. gs_pre_get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\plugin.php:487

[30-Apr-2013 17:07:12 UTC] PHP  95. WP_Query->__construct() C:\Users\serwis\Dropbox\www\XYZ\wp-content\themes\roots-XYZ\lib\custom.php:14

[30-Apr-2013 17:07:12 UTC] PHP  96. WP_Query->query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:3059

[30-Apr-2013 17:07:12 UTC] PHP  97. WP_Query->get_posts() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:2972

[30-Apr-2013 17:07:12 UTC] PHP  98. WP_Query->parse_query() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1922

[30-Apr-2013 17:07:12 UTC] PHP  99. absint() C:\Users\serwis\Dropbox\www\XYZ\wp-includes\query.php:1442

Câu trả lời:


5

Hoàn toàn hủy bỏ truy vấn chính là sự điên rồ ở mức độ cao, liên quan đến lớp phân wplớp.

Tôi sẽ:

  1. Kết nối pre_get_postsvới is_main_query()kiểm tra
  2. Chạy truy vấn đặc trưng (vẫn bên trong hook) và stash kết quả ở đâu đó
  3. Sử dụng các kết quả đó để đặt các bài đăng bị loại trừ trên truy vấn chính

Nếu tôi hiểu bạn chính xác, tôi không thể ngăn WP thực hiện truy vấn mặc định cho mẫu mà không làm phiền WP, nhưng NHƯNG tôi có thể thực hiện WP_query bình thường trước khi truy vấn chính được thực hiện và mọi thứ sẽ ổn chứ? Bạn có thể giải thích cho tôi tại sao truy vấn mặc định rất quan trọng, ngay cả khi cơ chế WP cốt lõi (nhận nội dung) hoạt động trước khi thực hiện không? (tôi không quen thuộc lắm với wp core, nhưng sẵn sàng học hỏi :))
Gniewomir wiechowski

Đơn giản chỉ cần đặt truy vấn chính được dán kỹ lưỡng vào quá trình tải lõi WP. Nó tương đối dễ dàng để sửa đổi nó, nhưng cố gắng loại bỏ nó hoàn toàn là khó chịu và một kỹ thuật không bao giờ được sử dụng trong thực tế. Nó có thể được thực hiện, nó chỉ không thực tế từ quan điểm nỗ lực phát triển. Và có - bạn có thể chạy các truy vấn tùy chỉnh một cách độc lập, vì chúng sẽ không can thiệp vào truy vấn chính (ngoại trừ query_posts()một truy vấn không nên sử dụng). Chỉ cần cẩn thận với is_main_query()kiểm tra để thay đổi của bạn áp dụng cho những gì cần và không phải tất cả các truy vấn.
Rarst

Cảm ơn về câu trả lời. Nó thực sự hữu ích. Tôi sẽ thử cách tiếp cận của bạn thay vì hack WP :)
Gniewomir wiechowski

Tôi sẽ đưa ra rằng vì nhận xét này được tạo ra vào năm 2013, bây giờ sẽ có thêm sự điên rồ ở cấp độ trung bình 2016. Một trường hợp sử dụng cho hành vi này sẽ là một giao diện được điều khiển không phải bởi khuôn mẫu PHP / HTML mà là JavaScript. Nếu dữ liệu bootstrap cần thiết không khớp với WP_Query mặc định thì đó có thể là chi phí "không cần thiết" cho người dùng đã đăng nhập.
biên tập viên

9

Tôi biết nó có thể là muộn để trả lời nhưng tôi đã gặp vấn đề tương tự trong khi thực hiện dự án thử nghiệm của tôi. Đây là cách tôi giải quyết nó.

/* apply this filter only on relevant to you pages */
function mb_bail_main_wp_query( $sql, WP_Query $wpQuery ) {
    if ( $wpQuery->is_main_query() ) {
        /* prevent SELECT FOUND_ROWS() query*/
        $wpQuery->query_vars['no_found_rows'] = true;

        /* prevent post term and meta cache update queries */
        $wpQuery->query_vars['cache_results'] = false;

        return false;
    }
    return $sql;
}
add_filter( 'posts_request', 'mb_bail_main_wp_query', 10, 2 );

@UPDATE:

Mã đã thay đổi để sử dụng chức năng bình thường thay vì mã ẩn danh và khiến mã được trả về 'false' thay vì 'CHỌN 0 AS ID' vì nó gây ra trả về một đối tượng WP_Post trống giả. Trả về 'false' làm cho $ wpdb-> get_results () được bảo lãnh sớm để không có truy vấn nào được thực hiện.


4
Gần như không bao giờ là quá muộn, vì câu trả lời không chỉ dành cho người hỏi. Bạn có thể vui lòng thêm một số giải thích bổ sung? Có rất nhiều trong đó, ví dụ, vì hàm ẩn danh, mã này cần PHP 5.3+.
Nicolai

tìm thấy tốt, lưu ý rằng đối tượng WP_Query đã được chuyển qua dưới dạng tham chiếu được chỉ định trong tài liệu .
Aurovrata
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.