Putem conecta o metodă statică a unei clase la add_action în interiorul acelei clase?

6 dec. 2016, 04:55:46
Vizualizări: 21K
Voturi: 9

Practic, ceea ce încerc să fac este să conectez o metodă statică a unei clase la o altă metodă statică din aceeași clasă.

Codul este aici:

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 sau https */
        $scheme = parse_url( get_bloginfo('url'), PHP_URL_SCHEME );

        /* înregistrează gmaps api și 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 ); 

    }
}

Este posibil acest lucru? Nu știu sigur, deoarece sunt puțin nou în acest tip de structură.

ACTUALIZARE De asemenea, apelez această clasă într-un fișier extern.

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
Comentarii

da, este posibil și ai făcut-o corect, ai primit vreo eroare?

GKS GKS
6 dec. 2016 06:43:52

Salut @GovindKumar, nu primeam nicio eroare, însă scripturile nu sunt încărcate când vizualizez sursa paginii.

Am folosit funcția wp_enqueue_script, doar că am uitat să o includ în exemplul meu. scuze.

Această clasă LocatorMap este conectată la funcția register_activation_hook astfel:

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

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

GreyWolfram GreyWolfram
6 dec. 2016 07:05:10
Toate răspunsurile la întrebare 3
1
17

register_activation_hook rulează doar o singură dată, adică atunci când plugin-ul este activat pentru prima oară - folosește hook-ul init în schimb pentru a "porni" plugin-ul tău:

add_action( 'init', 'LocatorMap::init' );
6 dec. 2016 12:16:09
Comentarii

ahh da, trebuie să înregistrez scripturile doar o singură dată. deci practic folosesc acel register_activation_hook. pot folosi add_action( 'init', array( 'LocatorMap', 'init' ) );? dar init poate face și asta. cred?

GreyWolfram GreyWolfram
7 dec. 2016 00:16:03
1

Recent am avut nevoie să fac același lucru și am ajuns să folosesc static:: legarea statică întârziată împreună cu constanta specială ::class. Legarea static:: va face referire la clasa apelantă, în timp ce constanta ::class va returna un șir de caractere care reprezintă numele clasei apelante (inclusiv namespace-ul!).

Folosind exemplul din întrebare, implementarea ar arăta cam așa:

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

    public function registerScripts() {}
}

Deoarece static:: face referire la clasa apelantă, acest lucru permite scrierea de clase reutilizabile pentru plugin-urile/temele tale și oarecum încapsularea unei părți din complexitatea moștenită de WordPress.

De exemplu, ai putea scrie o clasă abstractă pentru tipuri personalizate de postări astfel:


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

După aceea, poți crea tipuri personalizate de postări fără a fi nevoie să duplici tot codul boilerplate în fiecare subclasă, astfel:

namespace WordpressPlugin;

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

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

Mulțumesc mult pentru exemplul clar

brasofilo brasofilo
11 aug. 2023 04:23:22
0

folosește funcția get_called_class()

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