Cách truyền loại bài đăng tùy chỉnh vào lớp riêng thay vì WP_Post


7

Tôi muốn tạo một lớp con WP_Postvà thêm một số "chức năng mô hình" vào nó. Làm cách nào tôi có thể buộc WP tạo các đối tượng của lớp con đó thay vì chính WP_Post, khi tôi truy vấn loại bài đăng tùy chỉnh của mình?

Thí dụ:

Giả sử tôi có hai loại bài tùy chỉnh: BookReview. Mỗi cuốn sách có thể có nhiều đánh giá. Trên cuốn sách của tôi, tôi muốn một phương pháp tổng hợp tất cả các đánh giá của nó. Tôi định nghĩa lớp sau:

class Book extends WP_Post
{
    public function reviewsSummary()
    {
        // Retrieve all reviews for $this book
        // Sum up their ratings
        // Return that sum
    }
}

Có cách nào, ví dụ như khi gọi register_post_type(), để buộc WordPress chuyển tất cả các bài đăng thuộc loại "sách" vào Booklớp của tôi WP_Postkhông?

Có thể trông giống như thế này:

register_post_type('book', [
    …,
    'class' => Acme\Models\Book::class
]);

Tôi thích ý tưởng yêu cầu register_post_type trả lại lớp của riêng bạn thay vì lớp wp_post. Nhưng không có chức năng đó không tồn tại trong lớp hiện tại.
iambriansreed

Bạn có thể muốn sử dụng Trình trang trí nếu bạn cần mở rộng chức năng hoặc Proxy nếu bạn cần có một lớp trừu tượng để tái cấu trúc và tách rời (không phải để có quyền truy cập vào các chức năng riêng tư hoặc được bảo vệ!). Bạn cũng có thể xây dựng một nhà máy và một số kho lưu trữ nơi bạn có thể trả lại bất cứ điều gì làm hài lòng nhu cầu của bạn. WP_Posthiếm khi cần trực tiếp trong trường hợp bạn không phải dựa vào kiểm tra đối với một loại cụ thể.
kaiser

Những người Btw có câu hỏi tương tự có thể quan tâm đến Gỗ: timber.github.io/timber
jsphpl

Câu trả lời:


10

WP_Postlớp trong WP là final, vì vậy nó rõ ràng cấm phân lớp. Nó cũng khá mơ hồ trong thực tế, rất nhiều mã xung quanh sẽ vui vẻ lấy / sản xuất các bài viết giống như các đối tượng miễn là chúng đã thiết lập cấu trúc dữ liệu.

Thật khó để giới thiệu một giải pháp thay thế mà không biết thêm về nhu cầu cụ thể của bạn. Nói chung và giả sử sử dụng trong các mẫu, điển hình sẽ là tạo một hàm thẻ mẫu sẽ tính điểm cho bài đánh giá, được cung cấp cho nó dưới dạng đối số và / hoặc hiện tại trong Vòng lặp.


1
Chúng tôi sẽ không thể là trận chung kết quá lâu nữa, chúng tôi hy vọng: core.trac.wordpress.org/ticket/24672#comment:13
iambriansreed

Đúng vậy, phải học nó một cách khó khăn
Sỉ

5

Cách "phân lớp" WP_Post

Cảm ơn bạn, @Rarst đã chỉ ra vấn đề mà bạn không thể phân lớp WP_Post , đây là một vấn đề lớn trong trường hợp này.

Giải pháp thay thế

Tuy nhiên, có một cách làm việc xung quanh nó bằng cách sử dụng lớp trình bao bọc có một đối tượng WP_Post thực được lưu trữ dưới dạng một thuộc tính và hiển thị nó thông qua các phương thức ma thuật để hành xử như một.

Hai ví dụ về cách tiếp cận đó có thể được tìm thấy ở đâyđây .

Cảnh báo: Trong nhiều trường hợp, cách tiếp cận này có thể không hoạt động vì những lý do khác nhau, một là các đối tượng này sẽ không vượt qua được instanceof WP_Postkiểm tra.


Móc vào đâu

Vì vậy, giả sử chúng ta có thể thay thế WP_Post bằng cách nào đó. Thứ tôi đang thực sự tìm kiếm là nơi để móc vào để thay thế WP_Post. Câu trả lời cho câu hỏi này là posts_resultsbộ lọc và đã được đưa ra ở đây: https://stackoverflow.com/a/40631962/3919281

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.