web-dev-qa-db-fra.com

Comment convertir un type de message personnalisé en classe séparée au lieu de WP_Post

J'aimerais créer une sous-classe de WP_Post et y ajouter une "fonctionnalité de modèle". Comment puis-je forcer WP à créer des objets de cette classe enfant au lieu de WP_Post lui-même, lorsque j'interroge mon type de message personnalisé?

Exemple:

Supposons que j'ai deux types de publication personnalisés: Book et Review. Chaque livre peut avoir de nombreuses critiques. Dans mon livre, je veux une méthode pour résumer toutes ses critiques. Je définirais la classe suivante:

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

Existe-t-il un moyen, par exemple lorsque vous appelez register_post_type(), de forcer WordPress à diffuser tous les posts de type "book" dans ma classe Book au lieu de WP_Post?

Pourrait ressembler à quelque chose comme ça:

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

La classe WP_Post dans WP est final, elle interdit donc explicitement les sous-classes. Il est également assez vague dans la pratique, beaucoup de code prendra volontiers/produira des objets post - like tant qu'ils auront une structure de données établie.

Il est difficile de recommander une alternative sans en savoir plus sur vos besoins spécifiques. En règle générale, en supposant une utilisation dans les modèles, il est généralement recommandé de créer une fonction de balise de modèle qui calculera le score pour la note de révision, fournie en tant qu’argument et/ou en cours dans la boucle.

10
Rarst

Comment "sous-classer" WP_Post

Merci, @Rarst d'avoir signalé le problème suivant: vous ne pouvez pas sous-classer WP_Post , qui constitue un problème majeur dans ce cas.

Workaround

Il existe toutefois un moyen de contourner ce problème en utilisant une classe wrapper qui contient un véritable objet WP_Post stocké en tant qu'attribut et l'expose via des méthodes magiques afin de se comporter comme tel.

On peut trouver deux exemples de cette approche ici et ici .

Attention: dans de nombreux cas, cette approche peut ne pas fonctionner pour différentes raisons, l'une d'elles étant que ces objets ne passeront pas le contrôle instanceof WP_Post.


Où accrocher

Supposons donc que nous puissions remplacer WP_Post d’une manière ou d’une autre. Ce que je cherchais en réalité était où raccorder pour remplacer WP_Post. La réponse à cette question est le filtre posts_results et a été donnée ici: https://stackoverflow.com/a/40631962/3919281

5
jsphpl