El objetivo de esta charla es mostrar cómo aplicar buenas prácticas de desarrollo cuando trabajemos con WordPress, implementando PSRs y desacoplando nuestro código para poder migrarlo en un futuro a otras opciones sin esfuerzo y dotarle de una buena cobertura de tests.
Veremos cómo podemos desarrollar y mantener plataformas basadas en WordPress utilizando cosas como inyección de dependencias, rutas en anotaciones y controladores; cómo utilizar composer para plugins, themes y sus dependencias; cómo montar los despliegues y qué opciones tenemos para utilizar WordPress desde nuestros Bundes.
6. WtfPress hell
— HTTP vs WP_Query
— Hooks oriented development
— Dependencias (plugins) delegadas en el
usuario
— Ausencia de aplicación de PSRs
— No se utiliza Composer
15. Cómo mejorarlo
— Composer
— Injección de dependencias
— Mejor gestión de rutas
— Eliminar lógica de negocio en templates
— MVC
— Sin romper compatibilidad
18. Inyección de dependencias
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container,
new FileLocator([__DIR__ . "/Config"]));
$loader->load('services.yml');
19. Nuestro controller
class MiControlador {
/**
* Route("/custom-path/{method}", name="mi_ruta");
*/
function miAccion(Request $request)
{
return 'template.php';
}
}
20. Anotación de ruta
/**
* @Annotation
* @Target({"PROPERTY"})
*/
class Route{
/** @var string */
public $path;
/** @var string */
public $name;
function __construct( $data=[] ){
if (isset($data['value'])) {
$data['path'] = $data['value'];
unset($data['value']);
}
}
}
21. Recopilando las rutas
$routes = [];
AnnotationRegistry::registerFile( __DIR__ . "/Annotations/Route.php" );
$reflClass = new ReflectionClass("MiControlador.php");
foreach($reflClass->getMethods() as $method) {
$classAnnotations = $reader->getMethodAnnotations($method);
foreach ($classAnnotations as $route) {
$routes[$route->name] = $route;
}
}
24. ¿Twig?
Una de las formas de hacerlo (ejemplo simplificado)
add_filter( 'template_include', function ( $template ) use ($container) {
if ( $template = $container->get("wp_query")->query_vars["twig.template"] ) {
$twig = $container->get("twig");
$twig->render( $template );
// gestionar el response y terminar ejecución
}
return $template;
}
30. Estructura de directorios con Composer
Gestionados por composer
— public/_wordpress/
— public/wp-content/
— vendor/
Punto de entrada y configuración
— public/index.php
— public/wp-config.php
38. Conclusiones
— Se puede crear buen código en WordPress
sin estar acoplado
— Se puede iniciar un proyecto en
WordPress y migrar a Symfony después
— Se pueden integrar ambas plataformas