Chúng ta có nên tin tưởng bài toàn cầu?


21

@toscho để lại một bình luận cho câu trả lời này khiến tôi phải suy nghĩ lại. Chúng ta nên có bao nhiêu niềm tin trong phạm vi toàn cầu, đặc biệt liên quan đến bài đăng trên toàn cầu như thế $postnào?

Vậy thì sao? Biến toàn cục có thể được ghi đè từ mọi người trước khi séc của bạn chạy. Đó là điểm của các biến toàn cầu: truy cập toàn cầu.

$poství dụ, chắc chắn là một trong những thế giới chủ yếu được sửa đổi trong chính chủ đề hoặc bởi các plugin. Tuy nhiên, nó cũng được sử dụng phổ biến nhất trên toàn cầu trong các ứng dụng khác trong một mẫu nhất định để thiết lập các bài đăng liên quan.

Từ việc trả lời (và bình luận) một số bài đăng có vấn đề cụ thể do sử dụng truy vấn tùy chỉnh , thực sự nổi bật là hầu hết các vấn đề được gây ra do truy vấn tùy chỉnh không được đặt lại (truy vấn tùy chỉnh thay đổi toàn cục do truy vấn chính đặt).

Từ điều này, rõ ràng $postlà không đáng tin cậy. Bất kỳ đoạn mã được viết kém nào sử dụng truy vấn tùy chỉnh đều có thể thay đổi $posttoàn cục, do đó sẽ phá vỡ một cái gì đó (như các bài đăng liên quan).

Chỉ một số ít các nhà phát triển WordPress thực sự đủ hiểu biết trong hoạt động bên trong cốt lõi và biết những gì nên tránh và những gì không. Số lượng người dùng lớn hơn không biết lõi WordPress hoạt động như thế nào.

Họ chỉ cần tải xuống một chủ đề và cài đặt các plugin để làm những gì cần thiết hoặc thậm chí chỉ cần sao chép mã từ một hướng dẫn. Nói rằng họ cài đặt một plugin viết kém, phá vỡ các bài đăng liên quan của họ trên một bài đăng của họ, làm sao họ biết điều gì đã gây ra điều đó? Họ sẽ có thể tự sắp xếp điều đó hay họ sẽ là người thứ trăm viết email cho tác giả chủ đề về vấn đề này, hoặc đăng câu hỏi lên trang web này?

Câu hỏi của tôi: Làm thế nào bạn có thể bảo vệ chống lại các vấn đề như vậy gây ra bởi mã nhập khẩu khác khi một lượt thích toàn cầu $postkhông đáng tin cậy như vậy? Chúng ta có nên sử dụng toàn cầu như thế $postnào không? Các lựa chọn thay thế là gì?

Chỉ để chia sẻ tâm trí của tôi ở đây trước khi tôi kết luận: Tôi cũng đã nghĩ (và cũng thấy trong một số chủ đề và plugin) hoặc sử dụng wp_reset_postdata()hoặc wp_reset_query()trước khi sử dụng $post, để đảm bảo rằng toàn cầu đang được đặt lại cho truy vấn chính $post. Nhưng tại sao tôi nên thổi phồng mã của mình trong chủ đề của mình vì người khác đã không mã hóa đúng plugin của anh ấy? Và nếu ai đó đã thiết lập lại đúng truy vấn tùy chỉnh của họ, thao tác này sẽ chạy lần thứ hai không cần thiết, điều này không tốt.

Phương pháp thứ hai tôi nghĩ đến là sử dụng $wp_queryvà sau đó sử dụng các phương thức của nó, đại loại như thế $wp_query->post.

Bất kỳ suy nghĩ về điều này sẽ được đánh giá cao.


Đặt lại bài đăng chỉ sao chép một var sang một cái khác, bạn có thể gọi đó là một triệu lần trong mã của bạn và không thấy hiệu suất nào đạt được, vì vậy tôi không biết điều gì không tốt về điều đó.
Milo

Câu trả lời:


16

Có một sự thật đáng buồn: bạn không bao giờ có thể chắc chắn rằng một số mã sẽ không phá vỡ mã của bạn và bạn không thể làm gì để ngăn chặn điều đó. Đặc biệt là trong WordPress, nơi mọi thứ đều mang tính toàn cầu.

Điều đó nói rằng, vâng, toàn cầu $postlà một trong những var toàn cầu được sử dụng nhiều nhất, vì vậy sử dụng sự chăm sóc đặc biệt cho nó có thể là một ý tưởng tốt.

Trong mã của tôi, tôi hiếm khi truy cập trực tiếp toàn cầu $post.

Khi trong cuộc thi số ít , tôi sử dụng get_queried_object()và thường kiểm tra xem có phải $postlà một WP_Posttrường hợp hợp lệ không :

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

Tôi cũng kiểm tra trong những trường hợp hiếm hoi tôi truy cập $posttrực tiếp.

Hãy xem xét rằng get_queried_object()trả về một giá trị không mong muốn nếu một số mã sử dụng query_posts, nhưng hey, nếu ai đó sử dụng mã dựa vào query_posts, họ xứng đáng với nó nếu trang web của họ bị hỏng :)

Hơn nữa, nếu tôi mong đợi một số điều kiện, tôi kiểm tra chúng, ví dụ như các loại bài đăng cụ thể hoặc trạng thái cụ thể.

Nếu tôi cần kiểm tra nhiều hơn và ở nhiều nơi hơn, tôi tạo một chức năng để thực hiện chúng:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

Khi bên trong một truy vấn tùy chỉnh, trong khi lặp, gọi the_post()lại đặt lại đối tượng bài, vì vậy nó sẽ ổn. Sau đó, tôi có trách nhiệm gọi wp_reset_postdata()sau một truy vấn tùy chỉnh và tất nhiên tôi làm điều đó :)

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.