È possibile agganciare un metodo statico di una classe ad add_action all'interno della stessa classe?

6 dic 2016, 04:55:46
Visualizzazioni: 21K
Voti: 9

In pratica, sto cercando di agganciare un metodo statico di una classe a un altro metodo statico della stessa classe.

Il codice è questo:

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 );

        /* registra api gmaps e info box */
        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 ); 

    }
}

È possibile? Non lo so dato che sono un po' nuovo con questo tipo di struttura.

AGGIORNAMENTO Sto anche chiamando questa classe in un file esterno.

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
Commenti

sì, è possibile e l'hai fatto correttamente, hai ricevuto qualche errore?

GKS GKS
6 dic 2016 06:43:52

Ciao @GovindKumar non ricevevo alcun errore, tuttavia gli script non vengono accodati quando visualizzo il sorgente della pagina.

Ho utilizzato la funzione wp_enqueue_script, ho solo dimenticato di includerla nel mio esempio. scusa.

Quella classe LocatorMap è agganciata alla funzione register_activation_hook come

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

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

GreyWolfram GreyWolfram
6 dic 2016 07:05:10
Tutte le risposte alla domanda 3
1
17

register_activation_hook viene eseguito solo una volta, cioè quando il plugin viene attivato per la prima volta - utilizza invece l'hook init per "avviare" il tuo plugin:

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

ahh sì, ho solo bisogno di registrare gli script una volta. quindi in qualche modo uso quel register_activation_hook posso usare il add_action( 'init', array( 'LocatorMap', 'init' ) ); ? ma init forse lo fa anche. penso?

GreyWolfram GreyWolfram
7 dic 2016 00:16:03
1

Recentemente ho dovuto fare la stessa cosa e alla fine ho utilizzato il static:: late static binding insieme alla speciale costante ::class. Il binding static:: fa riferimento alla classe chiamante, mentre la costante ::class restituisce una stringa con il nome della classe chiamante (compreso il namespace!)

Usando l'esempio della domanda, l'implementazione sarebbe simile a questa:

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

    public function registerScripts() {}
}

Poiché static:: fa riferimento alla classe chiamante, questo permette di scrivere classi riutilizzabili per i tuoi plugin/temi, e in un certo senso incapsulare parte della legacy "brutta" di WordPress.

Ad esempio, potresti scrivere una classe astratta per i custom post type in questo modo:


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() {}
}

Dopo di che, ora puoi creare custom post type senza dover duplicare tutto il codice boilerplate in ogni sottoclasse, in questo modo:

namespace WordpressPlugin;

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

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

Grazie mille per l'esempio chiaro

brasofilo brasofilo
11 ago 2023 04:23:22
0

usa la funzione get_called_class()

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