Можно ли привязать статический метод класса к add_action внутри этого класса?
По сути, я пытаюсь привязать статический метод класса к другому статическому методу этого же класса.
Вот код:
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' ) );
Недавно мне пришлось делать то же самое, и в итоге я использовал 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(
...
) );
}
}
