Make better code with WordPress™.

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14. 13
  15. 14
  16. 15
  17. 16
  18. 17
  19. 18
  20. 19

    class MyController extends AbstractController
    {

        /**
        * @Route("/profile/{name}", name="profile_route")
        */
        function profileAction($name, Request $request, WP_Query $query)
        {

            if( !$item = $this->get("user.repository")->findBySlug($name) )
            {
                thrown $this->createNotFoundException();
            }

            return $this->templateResult('user/profile.php', [
                "data" => $item
            ]);
        }

    }

Sense te permite escribir código limpio y elegante utilizando WordPress™ como plataforma de desarrollo sin perder compatibilidad con los plugins y themes existentes.

Composer

El principal objetivo de Sense es poder crear código mantenible con WordPress. Por ello el uso de composer es obligatorio.

Con Composer podrás gestionar tanto tus dependencias con librerías de terceros, como asegurar las versiones de tus plugins y themes en todo momento gracias a WPackagist.


{
    "require": {
        "php": ">=5.4",
        "composer/installers": "1.*",
        "johnpbloch/wordpress": "4.*",
        "simettric/sense": "dev-master"
    },
    "extra": {
        "wordpress-install-dir": "public/wp/",
        "installer-paths": { }
    }
}


/**
* @Route("/blog/{month}/{year}/{id}-{name}",
         name="post_detail",
         requirements="{id=\d+}")
*/
function postAction($id, $name, $month, $year)
{

    $item = $this->get("post.repository")->find($id);

    if(!$item){
        throw $this->createNotFoundException();
    }

    return $this->templateResult('blog/detail.php', [
        "item" => $item
    ])
}

Rutas y controladores

Con Sense puedes definir tus rutas mediante anotaciones en tus controladores. Internamente se añadiran al sistema de enrutamiento interno de WordPress.

Desde los controladores podrás acceder al contenedor de dependencias, al WP_Query y al Request de la petición.

Trabajarás con WordPress como si se tratase de un framework MVC como Laravel o Symfony3.

Sistema de vistas

Sense respeta al máximo la forma de crear templates y vistas HTML de WordPress.

Desde la función senseView() podrás acceder a los parámetros pasados desde los controladores, generar rutas en base a su nombre además de utilizar el Loop y otras funciones habituales de WordPress.

Tu lógica de negocio nunca volverá estar acoplada en tus plantillas.


<?php
    get_header();
    
    $profile     = senseView()->get("profile_data");
    $profile_url = senseView()->genUrl('user_profile', 
                                      ['id' => $profile->ID]);
?>

<h2>Favoritos de <?php echo $profile->username ?></h2>
<a href="<?php echo $profile_url ?>">ir a su perfil</a>

<?php 
   if ( have_posts() ): while ( have_posts() ): [...]
?>

<?php get_footer();

Inyección de dependencias

Sense hace uso del componente de Inyección de dependencias de Symfony3.

Gracias al uso de Inyección de dependencias podrás desacoplar tu código, haciéndolo más testeable y reduciendo el coste futuro de migrar tu plataforma a frameworks como Laravel, Symfony o Silex.


#services.yml
parameters:
  app.parameter_name: Your parameter here

services:
  app.product_repository:
    class: Simettric\Plugin\Repository\ProductRepository
    arguments: ["%sense.parameter_name%", "@wp_query"]


#YourController.php
function detailAction($product_id)
{
    $service   = $this->get("app.product_repository");
    $product   = $service->find($product_id);
    
    return $this->jsonResult($product);
}

Code is poetry

Trabaja con WordPress siguiendo buenas prácticas y PSRs

ESTRUCTURA

  • tu_plugin
    • Config
      • services.yml
    • Controller
      • ProductController.php
    • Repository
      • ProductRepository.php
    • Views
      • Product
        • detail.php
        • list.php
    • Tests
    • composer.json
    • tu_plugin.php

ProductController.php


/**
* @Route("/products/{product_id}-{name}")
*/
function detailAction($product_id)
{

    $repo    = $this->get("product_repository");
    $product = $repo->find($product_id);
    
    return $this->templateResult("product.php", [
       "item"    => $product,
       "related" => $repo->related($product)
    ]);
}


product.php


<?php
    get_header();
    $item    = sense_view("item");
    $related = sense_view("related");
?>

<h2><?php echo get_the_title($item) ?></h2>

<?php foreach($related as $relItem) { ?>

    <p><?php echo get_the_title($relItem) ?></p>

<?php } ?>

<?php get_footer();