Como converter o tipo de postagem personalizado em uma classe separada em vez de WP_Post

8

Gostaria de criar uma subclasse de WP_Post e adicionar alguma "funcionalidade de modelo" a ela. Como posso forçar o WP a criar objetos dessa classe filha em vez do próprio WP_Post, quando eu consultar meu tipo de postagem personalizada?

Exemplo:

Vamos supor que eu tenha dois tipos de postagem personalizados: Book e Review . Cada livro pode ter muitos comentários. No meu livro, quero um método para resumir todas as suas resenhas. Eu definiria a seguinte classe:

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

Existe uma maneira, por exemplo, ao chamar register_post_type() , para forçar o WordPress a lançar todas as postagens do tipo "livro" na minha Book classe em vez de WP_Post ?

Pode ser algo assim:

register_post_type('book', [
    …,
    'class' => Acme\Models\Book::class
]);
    
por jsphpl 16.11.2016 / 11:47

2 respostas

10
A classe

WP_Post no WP é final , portanto, ela proíbe explicitamente a subclassificação. Também é bastante vago, na prática, muitos dos códigos irão alegremente produzir / produzir objetos pós- como , desde que tenham uma estrutura de dados estabelecida.

É um desafio recomendar uma alternativa sem saber mais sobre suas necessidades específicas. Em um uso geral e presumido em modelos, o típico seria criar uma função de tag de modelo que calcularia a pontuação para a postagem de revisão, fornecida a ela como argumento e / ou atual no Loop.

    
por Rarst 16.11.2016 / 15:58
5

Como "subclasse" WP_Post

Obrigado, @Rarst por apontar o problema de que você não pode criar subclasses de WP_Post , o que é um grande problema neste caso.

Solução alternativa

Existe, no entanto, uma maneira de contornar isso usando uma classe wrapper que possui um objeto WP_Post real armazenado como um atributo e o expõe através de métodos mágicos para se comportar como um.

Dois exemplos dessa abordagem podem ser encontrados aqui e aqui .

Aviso: em muitos casos, essa abordagem pode não funcionar por diferentes razões, sendo uma delas que esses objetos não passarão uma instanceof WP_Post check.

Onde ligar

Então vamos supor que poderíamos substituir o WP_Post de alguma forma. A coisa que eu estava realmente procurando era onde ligar para substituir WP_Post . A resposta a esta questão é o filtro posts_results e foi dado aqui: enlace

    
por jsphpl 20.11.2016 / 18:35