Phạm vi biến chủ đề WordPress


9

Tôi cần tạo một biến có thể được truy cập trong các tệp mẫu WordPress Theme của mình (index.php, header.php, v.v.). Tôi biết các định nghĩa hàm đi vào bên trong functions.phptệp mẫu (trong đường dẫn chủ đề của bạn), nhưng không có điều đó cho các biến.

Ví dụ: tôi liên tục cần truy xuất Danh mục trong Chủ đề của mình, vì vậy tôi muốn có thể truy cập danh mục này từ mọi nơi trong chủ đề của mình:

$categories = get_categories(); /* get_categories() is a wordpress function */ 

Bằng cách này, tôi có thể chỉ cần truy cập vào dữ liệu được phân bổ mà không phải phân bổ lại dữ liệu mỗi khi tôi cần nhận danh mục của mình.

Thật không may, việc thêm đoạn mã đó vào functions.phptệp của tôi , không hoạt động, cũng không tạo ra biến global.

Câu trả lời:


5

Rõ ràng globallà lừa. Vấn đề là biến của tôi đáng $categorieslẽ phải được xác định lại với một globalmặt trước của nó, trong mỗi mẫu tôi cần để sử dụng nó.


2
Có ai khác biết về một giải pháp trực quan hơn là phải xác định lại nó là toàn cầu trong mỗi tệp mẫu không? Tôi sử dụng phương pháp này trong việc phát triển chủ đề của mình và nó có vẻ ... không đúng chỗ.

1
Tuyệt vời anh chàng, cảm ơn! Đối với bất kỳ ai sẵn sàng, người này hơi dày như tôi: Trong tệp tin.php của bạn: <? Php $ test = "Tôi là một bài kiểm tra!"; ?> Trong của bạn, tôi không biết, tiêu đề.php: <? Php toàn cầu $ test; kiểm tra tiếng vang $; ?> và bạn là vàng!
Đaminh

Nếu điều này giúp làm rõ: tất cả các mẫu file trong WordPress được gọi bằng require()tuyên bố đó được gói trong các chức năng: get_header(), get_footer(), vv; mà chính họ là các hàm bao quanh hàm get_template_part(). Vì các hàm trong PHP chỉ có quyền truy cập vào các biến được định nghĩa trong chúng hoặc được chuyển qua tham chiếu đến chúng, nếu bạn muốn sử dụng một biến từ phạm vi toàn cầu (hoặc xác định một biến và làm cho nó có thể truy cập được trong phạm vi toàn cầu), bạn phải thông báo cho nó với từ khóa toàn cầu đầu tiên.
Goldenapples

1

Dominic (không biết cách thêm ghi chú vào câu trả lời của anh ấy):

xác định chỉ chấp nhận vô hướng, vì vậy bạn không thể làm define( CATS, get_categories() ); và thậm chí không

$categories = get_categories();
define( CATS, $categories );

Mặt khác, định nghĩa hoạt động tốt và trên thực tế an toàn hơn cho vô hướng (vì bạn có thể chắc chắn các hằng số không thể bị ghi đè)


1

Tôi biết cái này thực sự cũ, nhưng có một căn phòng để cải thiện.

Bạn nên cân nhắc sử dụng $ GLOBALS ['chuyên mục'] thay vì chỉ toàn cầu.

Có hai lý do cho việc này:

  1. Chúng tôi không phải viết global $categories;mọi lúc.
  2. Rõ ràng là chúng ta đang sử dụng toàn cầu và sau đó thì không.

Xem xét mã này:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Chỉ khi chúng ta khởi tạo trạng thái toàn cầu ngay trước khi sử dụng biến, thật khó để biết, nó có toàn cầu hay không. Và đừng quên lặp lại nó trong bất kỳ tệp mẫu nào bạn có.

Theo tôi, có thể sử dụng các quy ước đặt tên cho điều đó, nhưng theo tôi thì có một cách tốt hơn.

Cân nhắc sử dụng $GLOBALS['categories'].

Chúng ta chỉ phải khởi tạo biến của mình một lần trong hàm.php mà không phải suy nghĩ global $categorieslại. Và chúng ta có thể thấy nó là một toàn cầu.

print_r ($GLOBALS['categories']);

Vấn đề hiệu suất không phải là một vấn đề ở tất cả trong tình huống này. Tôi sẽ trích dẫn Sara Golemon ( liên kết ):

Điều đó có nghĩa gì đối với việc bạn sử dụng mảng $ GLOBALS? Đúng vậy, từ khóa toàn cầu về mặt kỹ thuật nhanh hơn. Bây giờ, tôi muốn thực sự rõ ràng về một điều ở đây. Khả năng chi trả tốc độ nhỏ được cung cấp bằng cách sử dụng toàn cầu của bạn dưới dạng [biến tổng hợp] cần được cân nhắc nghiêm túc so với khả năng duy trì xem mã của bạn trong năm năm và biết rằng $ foo đến từ phạm vi toàn cầu. Something_USE ($ GLOBALS ['foo']); LUÔN LUÔN sẽ rõ ràng hơn với bạn so với toàn cầu $ foo toàn cầu; / * mã bó * / Something_USE ($ foo); Đừng khôn ngoan và dốt nát ngu ngốc ..


0

Điều này cũng hoạt động:

trong Hàm.php thêm define('TEST', 'this is a test');
và trong tiêu đề.php của bạn hoặc bất cứ điều gìecho TEST;

Có bất kỳ lợi thế hoàn hảo cho một phương pháp hơn một phương pháp khác?

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.