Desarrollo código mantenible en WordPress utilizando Symfony
-
Upload
asier-marques -
Category
Technology
-
view
928 -
download
2
Transcript of Desarrollo código mantenible en WordPress utilizando Symfony
![Page 1: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/1.jpg)
![Page 2: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/2.jpg)
![Page 3: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/3.jpg)
Acerca de mí
Asier MarquésOne man army in Simettric.com
@asiermarquesgithub.com/Simettriclinkedin.com/in/asier
![Page 4: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/4.jpg)
"Cuando miras al abismo, el abismo también mira
dentro de tí"
![Page 5: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/5.jpg)
WtfPress
![Page 6: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/6.jpg)
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
![Page 7: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/7.jpg)
Wtf_Query
/category/animales => index.php?category=animales
WP_Query( array( “category” => “animales”) );
theme/category.php
![Page 8: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/8.jpg)
Template hierarchy
![Page 9: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/9.jpg)
WP_Query ruta personalizada
add_action('init', function() {
add_rewrite_rule( '^tasks/([^/]*)/?', 'index.php?post_type=task' . '&category=$matches[1]' . '&controller=mi_accion', 'top' );
add_rewrite_tag('%controller%', '(([^/]*))');
});
![Page 10: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/10.jpg)
Al entrar en esa ruta...
$wp_query->query_vars["post_type"]
$wp_query->query_vars["category"]
$wp_query->query_vars["controller"]
![Page 11: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/11.jpg)
...podemos llamar a nuestro "controlador"
add_action('parse_query', function(\WP_Query $wp_query) {
if( $wp_query->query_vars["controller"] == "mi_accion" ) { // ¿mi controlador? }
});
![Page 12: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/12.jpg)
![Page 13: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/13.jpg)
Hooks driven development
![Page 14: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/14.jpg)
WordPress heaven
— Mercado
— Tendencia a utilizarse como prototipo para validar mercado
— Su uso masivo
![Page 15: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/15.jpg)
Cómo mejorarlo
— Composer
— Injección de dependencias
— Mejor gestión de rutas
— Eliminar lógica de negocio en templates
— MVC
— Sin romper compatibilidad
![Page 16: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/16.jpg)
Demo
![Page 17: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/17.jpg)
Aplicando MVC e Inyección de dependencias
![Page 18: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/18.jpg)
Inyección de dependencias
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator([__DIR__ . "/Config"]));
$loader->load('services.yml');
![Page 19: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/19.jpg)
Nuestro controller
class MiControlador {
/** * Route("/custom-path/{method}", name="mi_ruta"); */ function miAccion(Request $request) {
return 'template.php'; }
}
![Page 20: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/20.jpg)
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']); }
}
}
![Page 21: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/21.jpg)
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;
}}
![Page 22: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/22.jpg)
Ejecutar controlador
add_action('parse_query', function(\WP_Query $wp_query) use ($container) {
if($route_name = $wp_query->query_vars[“route_name”]) {
if(isset( $routes[$route_name] )) {
$route = $routes[$route_name];
$controller = $route->createControllerInstance( $container );
$template = call_user_function( [ $controller, $route->getAction() ] );
$container->get("view")->setTemplate($template); } }});
![Page 23: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/23.jpg)
Vistas
add_filter( 'template_include', function ( $template ) use ($container) {
return $container->get("view")->getTemplate() ? : $template;
}
![Page 24: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/24.jpg)
¿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;
}
![Page 25: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/25.jpg)
![Page 26: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/26.jpg)
sense.simettic.comgithub.com/Simettric/Sense
Un proyecto en desarrollo activo, se acepta feedback [email protected]
![Page 27: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/27.jpg)
Composer
![Page 28: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/28.jpg)
Composer
— WPackagist.org
— Composer installers
![Page 29: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/29.jpg)
"repositories": [ { "type": "composer", "url": "https://wpackagist.org" } ], "require": { "php": ">=5.4", "composer/installers": "1.*", "johnpbloch/wordpress": "4.*", "wpackagist-plugin/akismet": "dev-trunk", "wpackagist-theme/hueman": "*" }, "extra": { "wordpress-install-dir": "public/_wordpress/", "installer-paths": { "public/wp-content/plugins/{$name}/": ["type:wordpress-plugin"], "public/wp-content/themes/{$name}/": ["type:wordpress-theme"] } }
![Page 30: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/30.jpg)
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
![Page 31: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/31.jpg)
public/index.php
define('WP_USE_THEMES', true);
require( __DIR__ . '/_wordpress/wp-blog-header.php' );
![Page 32: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/32.jpg)
public/wp-config.php
require __DIR__ . '/../vendor/autoload.php';
define( 'SITE_HOST', 'http://example.com' );define( 'WP_SITEURL', SITE_HOST . '/_wordpress' );define( 'WP_HOME', SITE_HOST . '/' );define( 'WP_CONTENT_DIR', __DIR__ . '/wp-content' );define( 'WP_CONTENT_URL', SITE_HOST . '/wp-content' );
if ( !defined('ABSPATH') ) define('ABSPATH', __DIR__ . '/_wordpress');
![Page 33: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/33.jpg)
Demo
![Page 34: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/34.jpg)
Una instalación base
github.com/Simettric/wordpress-composer-installation
![Page 35: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/35.jpg)
Entornos mixtos WordPress + Symfony
EkinoWordpressBundle
![Page 36: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/36.jpg)
SeguridadUsando el login de WordPress para autenticarme en Symfony
ekino_wordpress: security: firewall_name: "secured_area" login_url: "/wp-login.php"
security: providers: main: entity: { class: Ekino\WordpressBundle\Entity\User, property: login }
firewalls: secured_area: pattern: ^/admin access_denied_handler: ekino.wordpress.security.entry_point entry_point: ekino.wordpress.security.entry_point anonymous: ~
access_control: - { path: ^/admin, roles: ROLE_WP_ADMINISTRATOR }
![Page 37: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/37.jpg)
Repositorios
$postManager = $this->get('ekino.wordpress.manager.post');$userManager = $this->get('ekino.wordpress.manager.user');
$user = $userManager->find(2);
$post = $postManager->find(1);$post->setAuthor($user);
$postManager->save($post);
![Page 38: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/38.jpg)
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
![Page 39: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/39.jpg)
Code is poetry a symphony
![Page 40: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/40.jpg)
Gracias
![Page 41: Desarrollo código mantenible en WordPress utilizando Symfony](https://reader030.fdocuments.mx/reader030/viewer/2022013113/58720ee81a28ab176b8b8219/html5/thumbnails/41.jpg)
¿Preguntas?
Asier MarquésOne man army in Simettric.com
@asiermarquesgithub.com/Simettriclinkedin.com/in/asier