Câu trả lời là có, các hàm theme_mod sẽ chậm hơn, nhưng không đáng kể và lợi ích vượt xa sự khác biệt.
Mod chủ đề được lưu trữ dưới dạng tùy chọn. Vì vậy, về bản chất, các hàm theme_mod là các hàm bao quanh các hàm tùy chọn.
Trước tiên, hãy hiểu rằng các cài đặt theme_mod được lưu trữ dưới dạng một mảng trong một tùy chọn duy nhất, được khóa với tên chủ đề cụ thể. Vì vậy, nếu tôi làm điều này:
set_theme_mod('aaa',123);
set_theme_mod('bbb',456);
Sau đó, những gì tôi thực sự nhận được trong cơ sở dữ liệu là một hàng tùy chọn duy nhất có tên theme_mods_themename chứa một mảng được tuần tự hóa với ('aaa' => 123, 'bbb' => 456) trong đó.
Bây giờ, get_theme_mod
sẽ chậm hơn vì nó thực sự thực hiện hai get_option
cuộc gọi. Đầu tiên, nó được tên của chủ đề. Sau đó, nó được theme_mods_themename
tùy chọn. Vì vậy, ngay đó là mất 50% tốc độ. Phần còn lại của công việc được thực hiện chủ yếu nằm ở các bộ lọc, trong đó có một cuộc gọi bộ lọc bổ sung, nhưng trừ khi bạn có một cái gì đó trên bộ lọc đó, điều này không đáng kể.
Lưu ý rằng hệ thống tùy chọn lưu trữ dữ liệu đã truy xuất trong bộ đệm đối tượng, do đó, nó không thực hiện nhiều cuộc gọi cơ sở dữ liệu ở đây. Chỉ sử dụng kết quả đầu tiên trong một cơ sở dữ liệu nhấn.
Việc set_theme_mod
này sẽ chậm hơn một chút vì nó thực hiện hai cuộc gọi tùy chọn tương tự, sau đó nó thực hiện một get_option
cuộc gọi khác để lấy lại tên chủ đề, và sau đó thực hiện update_option
với toàn bộ các tùy chọn đã thay đổi. Điều này gây ra cập nhật cơ sở dữ liệu và việc nó gửi nhiều dữ liệu hơn thực sự có thể là nguyên nhân gây ra sự chậm chạp đáng chú ý. Cập nhật một vài byte nhanh hơn cập nhật một hàng lớn hơn. Nhưng thường thì không nhiều như bạn chú ý. Trừ khi bạn có cả đống thiết lập ...
Các chức năng mod chủ đề có thể là do tối ưu hóa tổng thể, chắc chắn, tuy nhiên bạn vẫn nên sử dụng chúng thay vì get_option và như vậy vì các chủ đề con.
Vấn đề với việc sử dụng các hàng tùy chọn trực tiếp là bạn đang sử dụng chúng trực tiếp và sử dụng tên khóa cụ thể cho cài đặt của mình.
Nếu tôi có một chủ đề gọi là "AAA" và tôi tạo một chủ đề con của nó có tên là "BBB" để sử dụng trên một trang web khác, thì chủ đề "AAA" của tôi có thể sử dụng một tùy chọn có tên là "ví dụ". Khi tôi cập nhật một trang web và nó cập nhật tùy chọn của tôi, thì tùy chọn tương tự bây giờ sẽ áp dụng cho chủ đề con của tôi. Điều gì xảy ra nếu tôi không muốn nó làm như vậy? Nếu tôi muốn chủ đề con sử dụng một bộ cài đặt tùy chọn khác thì sao?
Các mod chủ đề, bằng cách bao gồm tên chủ đề thực tế (và không phải là giá trị được mã hóa cứng) như một phần của khóa đảm bảo rằng mỗi "chủ đề" trên trang web sử dụng bộ cài đặt rất riêng của nó. Tôi có thể chuyển đổi qua lại và các cài đặt không chuyển giữa chúng, chúng giữ nguyên cách tôi đặt chúng. Đơn giản hơn, rõ ràng hơn, trực quan hơn.
Và nếu một số thay đổi cốt lõi hoặc plugin trong tương lai sửa đổi cách theme_mods hoạt động, thì bạn sẽ tự động nhận được lợi ích của điều đó mà không có bất kỳ thay đổi nào. Wrappers luôn luôn sẽ chậm hơn, đó là điều không thể tránh khỏi, đó là bản chất của Wrappers. Tuy nhiên, bạn vẫn đang viết mã PHP, không phải ngôn ngữ máy. Chúng tôi sử dụng các hàm bao như thế này để đơn giản hóa mọi thứ và chức năng riêng biệt. Chủ đề không cần phải biết, hoặc quan tâm, làm thế nào các tùy chọn của chúng được lưu trữ trong cơ sở dữ liệu hoặc cách đặt tên hoạt động. Các hàm theme_mod cung cấp một giải pháp đơn giản hơn, sạch hơn.
/wp-includes
vàooption.php
nơiget_option()
được xác định và tạitheme.php
nơiget_theme_mod()
được xác định, bạn có thể thấy rằng cái sau thực sựget_option()
tự gọi mình, hoạt động như một phần mở rộng của nó cũng áp dụng bất kỳ bộ lọc cần thiết nào. Có thể giải thích tại sao nó chậm hơn.