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
]);
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.
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.
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
.
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