在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();
}
而且有效:)