¿Podemos enganchar un método estático de una clase a add_action dentro de esa clase?

6 dic 2016, 04:55:46
Vistas: 21K
Votos: 9

Básicamente, lo que estoy intentando hacer es enganchar un método estático de una clase a otro método estático de esa misma clase.

El código está aquí:

class LocatorMap {
    
    public static function init() {

        add_action( 'wp_enqueue_scripts', array( __CLASS__, 'register_scripts' ) );

    }

    /* add_action( 'wp_enqueue_script', array( 'LocatorMap', 'register_scripts' ) ); */
    public function register_scripts() {

        global $post;

        /* http o https */
        $scheme = parse_url( get_bloginfo('url'), PHP_URL_SCHEME );

        /* registrar api de gmaps y caja de información */
        wp_register_script( 'google-maps-api', $scheme . '://maps.googleapis.com/maps/api/js', array('jquery'), FALSE, true );
        wp_register_script( 'google-maps-info-box', $scheme . '://cdn.rawgit.com/googlemaps/v3-utility-library/infobox/1.1.13/src/infobox.js', array( 'jquery', 'google-maps-api' ), '1.1.13', true ); 

    }
}

¿Es esto posible? No lo sé ya que soy un poco nuevo en este tipo de estructura.

ACTUALIZACIÓN También estoy llamando a esta clase en un archivo externo.

define( DEALERSHIP_MAP_URL, untrailingslashit( plugin_dir_url( __FILE__ ) )  );
define( DEALERSHIP_MAP_DIR, untrailingslashit( plugin_dir_path( __FILE__ ) ) );
define( DEALERSHIP_MAP_TEMPLATE, DEALERSHIP_MAP_DIR . '/templates' );

require_once( 'core/class-locator-map.php' );

register_activation_hook( __FILE__, array( 'LocatorMap', 'init' ) );
2
Comentarios

sí, es posible y lo hiciste bien, ¿obtuviste algún error?

GKS GKS
6 dic 2016 06:43:52

Hola @GovindKumar no estaba obteniendo ningún error, sin embargo los scripts no se encolan cuando veo el código fuente de la página.

Sí utilicé la función wp_enqueue_script, simplemente olvidé incluirla en mi ejemplo. Lo siento.

esa clase LocatorMap está siendo enganchada a la función register_activation_hook como

include_once( 'inc/class-locator-map.php' );

register_activation_hook( __FILE__, array( 'LocatorMap', 'init' ) );

GreyWolfram GreyWolfram
6 dic 2016 07:05:10
Todas las respuestas a la pregunta 3
1
17

register_activation_hook solo se ejecuta una vez, es decir, cuando el plugin se activa por primera vez. Usa el hook init en su lugar para "iniciar" tu plugin:

add_action( 'init', 'LocatorMap::init' );
6 dic 2016 12:16:09
Comentarios

ahh sí, solo necesito registrar los scripts una vez. así que más o menos uso ese register_activation_hook ¿Puedo usar el add_action( 'init', array( 'LocatorMap', 'init' ) ); ? pero init tal vez lo haga también. ¿no crees?

GreyWolfram GreyWolfram
7 dic 2016 00:16:03
1

Recientemente tuve que hacer lo mismo y terminé usando el static:: enlace estático en tiempo de ejecución junto con la constante especial ::class. El enlace static:: hará referencia a la clase que lo llama, mientras que la constante ::class devolverá una cadena con el nombre de la clase que lo llama (¡incluyendo el espacio de nombres!).

Usando el ejemplo de la pregunta, la implementación se vería así:

class LocatorMap {
    
    public static function init() {
        add_action( 'wp_enqueue_scripts', array( static::class, 'registerScripts' ) );
    }

    public function registerScripts() {}
}

Dado que static:: referencia a la clase que lo llama, esto permite escribir clases reutilizables para tus plugins/plantillas, y de cierta forma encapsular parte de la fealdad heredada de WordPress.

Por ejemplo, podrías escribir una clase abstracta para tipos de post personalizados así:


namespace WordpressPlugin;

abstract class AbstractPostType {
  const SLUG;

  private function __construct() {}

  public static function initialize() {
    add_action( 'init', array( static::class, 'registerPostType' ), 0 );
    add_action( 'init', array( static::class, 'registerTaxonomies' ), 1 );
    add_action( 'add_meta_boxes', array( static::class, 'addMetaBox' ) );
  }

  public static function registerPostType() {}

  public static function registerTaxonomies() {}

  public static function addMetaBox() {}
}

Después de esto, ahora puedes crear tipos de post personalizados sin tener que duplicar todo el código repetitivo en cada subclase, así:

namespace WordpressPlugin;

class ExamplePostType extends AbstractPostType {
  const SLUG = 'example-post-type';

  public static function registerPostType() {
    register_post_type( self::SLUG, array(
      ...
    ) );
  }
}
12 jul 2021 22:32:21
Comentarios

Muchas gracias por el claro ejemplo

brasofilo brasofilo
11 ago 2023 04:23:22
0

usa la función get_called_class()

public static function init() {
    add_action( 'wp_enqueue_scripts', array( get_called_class(), 'register_scripts' ) );
}
9 sept 2020 02:45:59