在你的WordPress主题中实例化一类插件的最好方法是什么?

时间:2016-03-10 作者:Ahmad Awais

在WordPress主题中实例化插件类的最佳方法是什么?要清楚,假设有一个名为Get\\u Meta\\u Data()的类,它用于从DB中获取任何post类型的元数据。所以,我定义了一个元数据price get\\u price()是Get_Meta_Data() 类,它存在于我们的插件中。如何在主题中调用该类来访问循环中帖子的价格。

我发现的解决方案:-主题无法访问插件中定义的类,因此在类之外的插件中构建方法,以便能够在主题中使用这些方法。而插件中的这些方法可以调用类。这不是一个理想的情况。

-Building an API around add_action: 创建自定义操作get_price_action 在构造函数中钩住get_price 作用可以调用do\\u action(“get\\u price\\u action”,50);在主题或其他插件的某个地方,您不必再关心类的内部工作。

如果停用插件,您仍然安全:WordPress只会忽略未知操作,do\\u action()不会造成任何伤害。另外,其他插件也可以删除或替换该操作,因此您已经用一个add\\u action()构建了一个很好的迷你API。

但我也希望我的班级能够get_the_ID(). 这使得单例类变得复杂。

我愿意接受各种建议和类架构。在类似的情况下,你们会怎么做?

目前,我的类看起来像这样,它只是插件的基文件中需要的。

    <?php
/**
 * Get The Car
 *
 * Gets car related stuff likes meta.
 *
 * @since   1.0.0
 * @package VRC
 */

// Exit if accessed directly.
if ( ! defined( \'ABSPATH\' ) ) {
    exit;
}

/**
 * VR_Get_Car.
 *
 * Get class for the car post_type.
 *
 * @since 1.0.0
 */

if ( ! class_exists( \'VR_Get_Car\' ) ) :

class VR_Get_Car {

    /**
     * The Car ID.
     *
     * @var     int
     * @since   1.0.0
     */
     public $the_car_ID;


     /**
      * The Meta Data.
      *
      * @var    array
      * @since  1.0.0
      */
      public $the_meta_data;


      /**
       * Meta Keys.
       *
       * @var   array
       * @since 1.0.0
       */
       private $meta_keys = array(
            // TAB                 : Basic Information.
            \'price\'                => \'vr_car_price\',
            \'price_postfix\'        => \'vr_car_price_postfix\',
        );


     /**
      * Constructor.
      *
      * Checks the car ID and assigns
      * the meta data to $the_meta_data.
      *
      * @since 1.0.0
      */
     public function __construct( $the_car_ID = NULL ) {
        // Check if there is $the_car_ID.
        if ( ! $the_car_ID ) {
            $the_car_ID = get_the_ID();
        } else {
            $the_car_ID = intval( $the_car_ID );
        }

            // Assign values to the class variables.
            if ( $the_car_ID > 0 ) {
            $this->the_car_ID    = $the_car_ID;
            $this->the_meta_data = get_post_custom( $the_car_ID );
        }
     }


     /**
      * Get Car: Meta.
      *
      * Gets the car meta_value if passed
      * a meta_key through argument.
      *
      * @since 1.0.0
      */
     public function get_car_meta( $meta_key ) {
        // If meta is set then return value else return false.
        if ( isset( $this->the_meta_data[ $meta_key ] ) ) {
            // Returns the value of meta.
            return $this->the_meta_data[ $meta_key ][0];
        } else {
            return false;
        }
     }


    /**
     * Get Car: ID.
     *
     * @since 1.0.0
     */
    public function get_car_ID() {
        return $this->$the_car_ID;
    }


    /**
     * Get Car: Price.
     *
     * @since 1.0.0
     */
    public function get_car_price() {
        // Returns false if ID is not present.
        if ( ! $this->the_car_ID ) {
            return false;
        }
        return $this->get_car_meta( $this->meta_keys[\'price\'] );
    }


    /**
     * Get Car: Price Postfix.
     *
     * @since 1.0.0
     */
    public function get_car_price_postfix() {
        // Returns false if ID is not present.
        if ( ! $this->the_car_ID ) {
            return false;
        }
        return $this->get_car_meta( $this->meta_keys[\'price_postfix\'] );
    }
   } // class `VR_Get_Car`  ended.

endif;
我正试图在我的主题中获取汽车价格,就像这样

// Object of VR_Get_Rental class.

$vr_get_rental = new VR_Get_Car( get_the_ID() );

$vr_this_rental[\'price\'] = $vr_get_rental->get_car_price();
但这行不通。主题并不能使全班重新认识。

EDIT: 多亏了阿兰,我才明白过来。问题是我的代码在里面get_car_meta() 函数而不是the_meta_data 我在使用meta_data 变量我刚刚更正了上面的代码。

但是从这次讨论中,我了解到我只能使用一个函数来返回这个类的完整实例。这很有帮助。我将更正上面的代码并进行解释。

现在,我的插件中有一个方法,可以帮助我在主题中实例化类。该方法是:

/**
 * Get an object of VR_Get_Car class.
 *
 * @since 1.0.0
 */
if ( ! function_exists( \'vr_get_car_obj\' ) ) {
    function vr_get_car_obj( $the_car_ID ) {
        // Bails if no ID.
        if ( ! $the_car_ID ){
            return \'No Car ID provided!\';
        }

        return new VR_Get_Car( $the_car_ID );
    }
}
在主题中,我使用以下代码与这个类进行交互。

// Object of VR_Get_Car class.
        if ( function_exists( \'vr_get_car_obj\' ) ) {

            $vr_get_car = vr_get_car_obj( get_the_ID() );

            $vr_car_price = $vr_get_car->get_price();

        }
而且有效:)

1 个回复
SO网友:Alain Schlesser

从主题内部访问插件中的类有两种常见的解决方案:

1。在插件中使用自动加载器(首选)

告诉自动加载程序如何将类名与包含该类的PHP文件名相关联。然后,当您访问PHP还不知道的类时,自动加载程序会检查与该类相关的文件并加载它。

使用自动加载器的一种简单方法是通过Composer,但如果没有任何额外的设置,这将使您的PHP需求达到PHP5。3.2+。

有关Composer自动加载的更多详细信息:https://getcomposer.org/doc/01-basic-usage.md#autoloading

2。使用函数检索实例

您可以提供一个函数来返回对插件类实例的引用。

然后,主题可以检查该函数是否存在,并检索所需的引用。在访问该引用之后,它可以像在插件中一样使用该类。

一般注释

相关推荐

Vimeo froogaloop

我是个新手,但我想用this idea 在Wordpress站点上嵌入的Vimeo剪辑中禁用正向搜索我的职能。我添加了phpfunction frogaloop_scripts() { wp_register_script(\'snippet\', \'https://siteurl/wp-content/themes/themename/js/snippet.js\'); wp_register_script(\'frogaloop\',\'https://f.vimeo