Implementando espacios de nombres en la plantilla de complemento

4

Para aprovechar el tiempo y mejorar mis prácticas de codificación, estoy empezando a implementar namespaces en mis propios complementos avanzando ya que hay algunas ventajas, como eliminar la ambigüedad .

Encontré una pregunta similar para ayudarme a configurar mi plantilla de plugin que funcionó para mí. Sin embargo, desde entonces lo he modificado ligeramente. Esta es mi configuración:

En wp-plugin-template/wp-plugin-template.php :

<?php
/**
 * Plugin Name: WP Plugin Template
 */
# If accessed directly, exit
if ( ! defined( 'ABSPATH' ) ) exit;
# Call the autoloader
require_once( 'autoloader.php' );

use PluginTemplate\admin\Plugin_Meta;
new Plugin_Meta;

En wp-plugin-template/autoloader.php :

<?php
spl_autoload_register( 'autoload_function' );
function autoload_function( $classname ) {
    $class = str_replace( '\', DIRECTORY_SEPARATOR, str_replace( '_', '-', strtolower($classname) ) );
    # Create the actual file-path
    $path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $class . '.php';
    # Check if the file exists
    if ( file_exists( $path ) ) {
        # Require once on the file
        require_once $path;
    }
}

En wp-plugin-template/admin/plugin-meta.php :

<?php
namespace PluginTemplate\admin;
class Plugin_Meta {
    public function __construct() {
        add_action( 'plugins_loaded', array($this, 'test' ) );
    }

    public function test() {
        echo 'It works!';
    }
}

Cuando intento activar la plantilla del complemento para la prueba, aparece el siguiente error:

  

Error grave : la clase PluginTemplate\admin\Plugin_Meta no se encuentra en wp-content/plugins/wp-plugin-template/wp-plugin-template.php en línea 11

En este caso, la línea 11 es:

new Plugin_Meta;

Creo que esto se debe a que el espacio de nombres se llame PluginTemplate ? ¿Qué estoy haciendo mal? Solo para reiterar, la pregunta anterior que mencioné me funcionó antes de comenzar a cambiar el nombre de mis archivos y directorios.

    
pregunta Ethan Jinks O'Sullivan 02.10.2016 - 19:19

2 respuestas

2

El problema está en la configuración del autocargador. Debe convertir su espacio de nombres de Camelcase en guiones para ubicar archivos según la estructura de carpetas actual.

Agregué la función de conversión y actualicé la función de autocargador.

En wp-plugin-template/autoloader.php :

<?php
spl_autoload_register( 'autoload_function' );
function autoload_function( $classname ) {
    $class = str_replace( '\', DIRECTORY_SEPARATOR, str_replace( '_', '-', strtolower(convert($classname)) ) );
    # Create the actual file-path
    $path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $class . '.php';
    # Check if the file exists
    if ( file_exists( $path ) ) {
        # Require once on the file
        require_once $path;
    }
}

function convert($class){
    $class = preg_replace('#([A-Z\d]+)([A-Z][a-z])#','_', $class);
    $class = preg_replace('#([a-z\d])([A-Z])#', '_', $class);
    return $class;
}

También tienes que actualizar tu espacio de nombres de nivel superior a WpPluginTemplate tanto en wp-plugin-template.php como en admin/plugin-meta.php , ya que estás usando wp-plugin-template como nombre de la carpeta de tu complemento.

ACTUALIZACIÓN:

Cuando el autocargador intente encontrar la clase Plugin_Meta , buscará YOUR_PLUGIN_DIR / wp-plugin-template / admin / plugin-meta.php

En wp-plugin-template.php

<?php
/**
 * Plugin Name: WP Plugin Template
 */
# If accessed directly, exit
if ( ! defined( 'ABSPATH' ) ) exit;
# Call the autoloader
require_once( 'autoloader.php' );

use WpPluginTemplate\admin\Plugin_Meta;
new Plugin_Meta;

En wp-plugin-template/admin/plugin-meta.php

<?php
namespace WpPluginTemplate\admin;
class Plugin_Meta {
    public function __construct() {
        add_action( 'plugins_loaded', array($this, 'test' ) );
    }

    public function test() {
        echo 'It works!';
    }
}
    
respondido por el C Sabhar 02.10.2016 - 20:23
2

Solo una nota adicional acerca de su cargador automático:

Si la entrada $classname es PluginTemplate\admin\Plugin_Meta , entonces $path se convierte

/full/path/to/wp-content/plugins/plugintemplate/admin/plugin-meta.php

y este archivo no existe y la definición de clase Plugin_Meta no está cargada.

también es no recomendado para usar la constante WP_PLUGIN_DIR directamente, existen alternativas, como plugin_dir_path( __FILE__ ) .

Hay más cargadores automáticos completos, por ejemplo, el autoloader generado en Composer .

    
respondido por el birgire 02.10.2016 - 21:14

Lea otras preguntas en las etiquetas