Documente Academic
Documente Profesional
Documente Cultură
Asier Marqués
One man army in Simettric.com
@asiermarques
github.com/Simettric
linkedin.com/in/asier
"Cuando miras al abismo,
el abismo también mira
dentro de tí"
WtfPress
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
Wtf_Query
theme/category.php
Template hierarchy
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%', '(([^/]*))');
});
Al entrar en esa ruta...
$wp_query->query_vars["post_type"]
$wp_query->query_vars["category"]
$wp_query->query_vars["controller"]
...podemos llamar a nuestro "controlador"
});
Hooks driven
development
WordPress heaven
— Mercado
— Tendencia a utilizarse como prototipo
para validar mercado
— Su uso masivo
Cómo mejorarlo
— Composer
— Injección de dependencias
— Mejor gestión de rutas
— Eliminar lógica de negocio en templates
— MVC
— Sin romper compatibilidad
Demo
Aplicando MVC e
Inyección de dependencias
Inyección de dependencias
$loader->load('services.yml');
Nuestro controller
class MiControlador {
/**
* Route("/custom-path/{method}", name="mi_ruta");
*/
function miAccion(Request $request)
{
return 'template.php';
}
}
Anotación de ruta
/**
* @Annotation
* @Target({"PROPERTY"})
*/
class Route{
if (isset($data['value'])) {
$data['path'] = $data['value'];
unset($data['value']);
}
}
Recopilando las rutas
$routes = [];
foreach($reflClass->getMethods() as $method) {
$classAnnotations = $reader->getMethodAnnotations($method);
$routes[$route->name] = $route;
}
}
Ejecutar controlador
if($route_name = $wp_query->query_vars[“route_name”])
{
if(isset( $routes[$route_name] ))
{
$route = $routes[$route_name];
$container->get("view")->setTemplate($template);
}
}
});
Vistas
}
¿Twig?
Una de las formas de hacerlo (ejemplo simplificado)
if ( $template = $container->get("wp_query")->query_vars["twig.template"] ) {
$twig = $container->get("twig");
$twig->render( $template );
return $template;
}
sense.simettic.com
github.com/Simettric/Sense
— WPackagist.org
— Composer installers
"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"]
}
}
Estructura de directorios con Composer
— public/_wordpress/
— public/wp-content/
— vendor/
— public/index.php
— public/wp-config.php
public/index.php
define('WP_USE_THEMES', true);
if ( !defined('ABSPATH') )
define('ABSPATH', __DIR__ . '/_wordpress');
Demo
Una instalación base
github.com/Simettric/wordpress-composer-
installation
Entornos mixtos
WordPress + Symfony
EkinoWordpressBundle
Seguridad
Usando 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 }
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);
Conclusiones
Asier Marqués
One man army in Simettric.com
@asiermarques
github.com/Simettric
linkedin.com/in/asier