Можно ли привязать статический метод класса к add_action внутри этого класса?

6 дек. 2016 г., 04:55:46
Просмотры: 21K
Голосов: 9

По сути, я пытаюсь привязать статический метод класса к другому статическому методу этого же класса.

Вот код:

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

        /* регистрируем API gmaps и 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 ); 

    }
}

Возможно ли это? Я не уверен, так как я новичок в такой структуре.

ОБНОВЛЕНИЕ Я также вызываю этот класс во внешнем файле.

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
Комментарии

да, это возможно, и вы сделали всё правильно, вы получали какие-либо ошибки?

GKS GKS
6 дек. 2016 г. 06:43:52

Привет @GovindKumar, ошибок не было, однако скрипты не подключаются, когда я просматриваю исходный код страницы.

Я действительно использовал функцию wp_enqueue_script, просто забыл включить её в свой пример. Извините.

Этот класс LocatorMap подключается через хук register_activation_hook как

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

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

GreyWolfram GreyWolfram
6 дек. 2016 г. 07:05:10
Все ответы на вопрос 3
1
17

register_activation_hook выполняется только один раз, то есть при первой активации плагина - вместо этого используйте хук init для "загрузки" вашего плагина:

add_action( 'init', 'LocatorMap::init' );
6 дек. 2016 г. 12:16:09
Комментарии

Ах да, мне нужно зарегистрировать скрипты только один раз. Так что я вроде как использую этот register_activation_hook. Могу ли я использовать add_action( 'init', array( 'LocatorMap', 'init' ) );? Но init, возможно, тоже подойдет. Думаю?

GreyWolfram GreyWolfram
7 дек. 2016 г. 00:16:03
1

Недавно мне пришлось делать то же самое, и в итоге я использовал static:: позднее статическое связывание вместе с особым константным выражением ::class. Связывание static:: ссылается на вызывающий класс, тогда как константа ::class возвращает строку с именем вызывающего класса (включая пространство имён!).

Используя пример из вопроса, реализация будет выглядеть примерно так:

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

    public function registerScripts() {}
}

Поскольку static:: ссылается на вызывающий класс, это позволяет создавать переиспользуемые классы для ваших плагинов/тем и в некотором роде скрывать часть унаследованной громоздкости WordPress.

Например, вы можете написать абстрактный класс для пользовательских типов записей вот так:


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

После этого вы можете создавать пользовательские типы записей, не дублируя стандартный код в каждом подклассе:

namespace WordpressPlugin;

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

  public static function registerPostType() {
    register_post_type( self::SLUG, array(
      ...
    ) );
  }
}
12 июл. 2021 г. 22:32:21
Комментарии

Большое спасибо за отличный пример

brasofilo brasofilo
11 авг. 2023 г. 04:23:22
0

используйте функцию get_called_class()

public static function init() {
    add_action( 'wp_enqueue_scripts', array( get_called_class(), 'register_scripts' ) );
}
9 сент. 2020 г. 02:45:59