在整个网站中使用OOP插件的方法

时间:2019-03-26 作者:Mateusz Bartkowski

我正在为一个网站制作一个插件,我想在一些不同的地方使用这些方法,比如页面模板、短代码等。

我不想让插件类成为全局的或创建多个实例(我在插件激活时创建一个实例)。

最好的方法是什么?我应该制作使用这些函数的短代码吗?还是有更好的方法?

2 个回复
SO网友:leymannx

我不完全确定你到底想做什么。但基本上只需创建一个实例,然后添加如下函数public static function FunctionName() 在插件激活后可以在任何地方使用。只需使用public function __construct().

从下面的示例插件中FooBar 方法可以在以下任何模板中调用:

<div class="foobar">
  <?php echo MyPlugin::FooBar(); ?>
</div>
要在另一个函数中调用其类内的FooBar,您需要执行以下操作:

self::FooBar();
示例插件
<?php
/*
Plugin Name: My Plugin
Description: Lorem ipsum dolor sit amet.
Version: 1.0
Author: You
Author URI: https://example.com
*/

class MyPlugin {

  // Fire your hooks from here.
  public function __construct() {

    add_action(\'wp_enqueue_scripts\', [$this, \'scripts\']);
  }

  // Use any generic function to be used for hooks.
  function scripts() {

    wp_enqueue_script(\'abc_snippets\', plugin_dir_url(__FILE__) . \'js/scripts.js\', [\'jquery\'], NULL, TRUE);
  }

  // Use static public functions to also be used outside of this class.
  public static function FooBar() {

    return \'Hello World\';
  }

}

new MyPlugin();

SO网友:Krzysiek Dróżdż

一种方法是使用类本身的静态方法,正如@leymannx在回答中所解释的那样。

我更喜欢一种稍微不同的方法,这是一种更好/更干净的方法(但这只是我的观点,所以请自由地与这种说法争论)。我是这样做的:

如果某个函数应该可以在模板中使用,那么我将其注册为模板标记(因此我将其命名为WordPress-get_X 为了得到一些东西the_X 用于打印某物

在文件中template-tags.php 我将添加以下代码:

function the_wpse_hello_world_message( $name = \'\' ) {
    echo get_wpse_hello_world_message( $name );
}

function get_wpse_hello_world_message( $name = \'\' ) {
    return apply_filters( \'get_wpse_hello_world_message\', \'Hello World\', $name );
}
因此,任何人都可以轻松地在代码中的任何地方使用这两个函数,并且很容易找到我插件的“公共API”。

后来在我的课堂上,我做了这样的事情:

class My_WPSE_Super_Plugin {

    protected function initHooks() {
        add_filter( \'get_wpse_hello_world_message\', array( $this, \'get_wpse_hello_world_message_filter\' ), 10, 2 );
    }

    ...

    protected get_wpse_hello_world_message_filter( $result, $name ) {
        if ( trim($name) ) {
            return \'Hello, \' . $name . \'!\';
        }

        return $result;  // or return \'Hello world!\'.
    }
}
这种方法的优点是(IMHO):

学习插件的“公共API”更容易(如果团队更大,或者如果你将长期使用给定的站点,这一点很重要)

  • 类中的真实代码得到了正确的封装,“公共API”与实际实现分离,因此很容易记录(为用户编写一些注释)并在以后进行重构。。。比如说,班级变得越来越大,你想把它分成更小的班级?然后呢?所有用户都必须更改其所有模板吗

  • 相关推荐

    如何处理多个forloop?

    I have and order\\u id as array但是wc_get_order 一次只接受一个id如何循环使用order\\u id并让项目id和项目名称的列表?我在课堂上使用这个。如果按如下所示传递单个id,则其工作正常 public function getStuffDone() { order_id =array(358,368) $order = wc_get_or