La clase WP_Post recientemente introducida en WordPress 3.5 permite facilitar muchas tareas comunes en el desarrollo sobre este CMS, en particular el trabajo con campos personalizados almacenados en la tabla {$wpdb->prefix}postmeta
.
Sin embargo, la forma en que está implementada esta clase aparentemente pone una limitante importante, ya que al estar definida como final
no puede ser extendida mediante herencia:
class MiPost extends WP_Post{} // Error Fatal: Class MiPost may not inherit from final class
Sin embargo, y aunque quizás no parezca obvio, es totalmente posible extender la funcionalidad de esta clase no utilizando herencia sino composición, por ejemplo, utilizando el patrón Decorator.
abstract class PostDecorator{ /** * Almacena el objeto post * @access private */ private $post; /** * @param object $post Un objeto de tipo WP_Post */ public function __construct( WP_Post $post ){ $this->post = $post; } } class PostProyecto extends PostDecorator{ /** * @param string Nombre de la propiedad que se desea obtener * @return string Valor de la propiedad */ public function __get( $key ){ // permite acceso como $objeto->autor if ( $key === 'autor' ) return $this->getAuthor(); // si no corresponde a la funcionalidad que estamos agregando // podemos aprovechar el método __get() del objeto post return $this->post->{ $key }; } /** * @return string Nombre del autor o enlace */ public function getAuthor(){ // el nombre del autor se almacena como un post meta con clave "_author" $author = $this->post->_author; // la url está en un post meta con clave "_author_url" $author_url = $this->post->_author_url; return ( $author_url ) ? '<a href="'. esc_url($author_url) .'">'. $author .'</a>' : $author; } } $project_post = get_post(123); $project = new PostProyecto( $project_post ); echo $project->autor; // <a href="http://felipe.lv">Felipe</a>
De este modo, podríamos crear una clase para cada tipo personalizado de contenido, de modo de poder separar ordenadamente la lógica de la presentación y obtener una sintaxis muy clara y simple.