Lo primero que tenemos que hacer es insertar una función en el archivo functions.php de nuestra template que posibilitará insertar más tarde un shortcode en cualquiera de nuestros posts:
function shortcodes_init(){ add_shortcode( 'mycode', 'componente' ); } add_action('init', 'shortcodes_init');
Seguidamente de esta función añadiremos la función componente que hemos determinado.
function componente(){ $var='valor de var'; return $var; }
Ahora editamos un post e incluimos el shortcode [mycode][/mycode] , guardamos el post y ya podemos ver en ese post valor de var .
Vamos a crear un par de varibles que nos proporciona Wordpress, $slug y $tmpldir para que nos quede la función así:
function componente(){ global $wp; $slug = add_query_arg( array(), $wp->request ); $tmpldir = get_template_directory(); echo $slug. ' - ' .$tmpldir; return; }
Actualizamos la url del post y podemos ver el slug o enlace permanente y la ruta absoluta al directorio de la template en uso.
Dentro del directorio de la plantilla actual creamos el directorio Component y dentro de éste el archivo controller.php donde escribiremos: esto es controller.php y lo guardamos.
Ahora modificamos la función para incluir este archivo controller.php
function componente(){ global $wp; $slug = add_query_arg( array(), $wp->request ); $tmpldir = get_template_directory(); include($tmpldir."/Component/controller.php"); return; } Y comprobamos que en el posts vemos "esto es controller.php"
Diseño MVC en Wordpress
Creamos una página nueva, le ponemos cualquier título, pero el enlace permanente o "slug" será "componente" y añadimos a éste post el shortcode [mycode][/mycode].
MODELO
Creamos Component/model.php y su primer método que retornará el path de la vista Component/views/vcustom.php
Component/model.php class Model { public function getview($viewParam){ if ($_GET['vplay']== "") { $view = $viewParam; } else { $view = $_GET['vplay']; } $VPATH = "views/v" . $view . ".php"; return $VPATH; }}
Vemos que si pasamos por url ?vplay=custom tenemos que el path será "views/vcustom.php"
Ahora creamos el método "componente" en el controller que llamará al modelo y a la vista
Component/controller.php //incluimos el modelo include('model.php'); public function componente(){ //instaciamos la clase $clas=new Model(); //incluimos la vista require_once($clas->getview('custom')); return ; }
La vista que obtendremos vendrá dada por el valor de vplay en la url pero, si no existe este valor, la obtenemos del valor que le pasamos como argumento al método getview('custom').
Ya podemos ver en la página /componente lo que tengamos en la vista views/vcustom.php
Siguiendo con el modelo, creamos la función "componente" que devolverá un objeto y a la que llamaremos en el controller
Component/model.php public function componente($objDatos) { $obj = new \stdClass(); $obj->objDatos = $objDatos; return $obj; }
CONTROLADOR
Component/controller.php public function componente(){ //instaciamos la clase $clas=new Model(); //creamos $objDatos $objDatos = 'valor de objDatos'; $custom=$clas->componente($objDatos); //$custom tendrá el valor del retorno del //método componente del modelo //incluimos la vista require_once($clas->getview('custom')); return ; }
VISTA
En la vista escribimos en php: print_r($custom) y tendremos:
stdClass Object ( [objDatos] => valor de objDatos )
RESUMEN MVC
Ahora y con un poco de imaginación podrás desarrollar este diseño con el que podrás crear una aplicación escalable cien por cien.
Crea funciones en el modelo y añade el valor de su retorno como valores de propiedades del objeto que devuelve el método componente:
public function componente($objDatos) { $obj = new \stdClass(); $obj->objDatos = $objDatos; $obj->getContent = $this->getContent($objDatos); return $obj; }
public function getContent($objDatos) { $pdo = new \PDO( --- tus credenciales de la BBDD -- ); $query = "SELECT ID,post_title FROM wp_posts WHERE post_type = ? ORDER BY ID"; $stmt = $pdo->prepare($query); $stmt->execute(['page']); $data["response"] = []; while ($results = $stmt->fetch(PDO::FETCH_OBJ)) { $data["response"][] = $results; } $stmt = null; return $data["response"]; }