私はチェックアウトシステムに追加の支払いプロバイダを「フックする」ためのプラグインに取り組んでいます。
私はfunction.phpに gtpCheckoutData というクラスを使って価格を計算します。
私のプラグインでは、この gtpCheckoutData クラスのデータを使用したいのですが、そうすると、次のようになります。
致命的なエラー:クラスgtpCheckoutDataが に見つかりません
私のプラグインコード:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// THIS IS THE PROBLEM
$this->price = new gtpCheckoutData;
add_action( 'init', array( $this, 'gtpCreatePayment' ) );
}
function gtpCreatePayment() {
if( isset( $_POST['checkout_submit'] ) ) {
$payment = $this->mollie->payments->create(array(
'amount' => $this->price->getPrice( 'inclusive' ),
));
header( "Location: " . $payment->getPaymentUrl() );
}
}
}
My gtpCheckoutData functions.phpのクラス
class gtpCheckoutData {
private $tax, $price;
public function __construct() {
$this->tax = get_gtp_option( 'gtp_tax' ) / 100;
$this->price = $_SESSION['shopping_cart']['total_price'] + $_SESSION['shopping_cart']['shipping_price'];
$this->shipping = $_SESSION['shopping_cart']['shipping_price'];
}
public function getPrice( $type ) {
if( isset( $type ) ) {
switch( $type ) {
case 'exclusive' :
$totalPrice = $this->price;
break;
case 'tax' :
$totalPrice = $this->price * $this->tax;
break;
case 'inclusive' :
$totalPrice = $this->price * ( $this->tax + 1 );
break;
}
return $totalPrice;
}
}
}
プラグインはfunctions.phpの前にロードされます。可能であれば、プラグインにクラスを含めるべきです。
クラスがテーマの一部であるシナリオがありましたが、クラスがテーマに含まれていると想定できないプラグインでも必要でした。そのような場合は、両方の場所にそのクラスを含め、それを「クラスが存在する」チェックでラップします。
このような:
if(!class_exists('My_Class'))
{
class My_Class{
// Class Methods and Properties
}
}
他のプラグインの前にロードされるMUプラグインにクラスを一度だけ含めることもできます。
テーマの前にプラグインがロードされます。プラグインで利用可能な最も初期のフックはplugins_loaded
(またはmu-pluginsの場合はmuplugins_loaded
)ですが、テーマはafter_setup_theme
以降のフックで動作します。ですから、プラグインの特定のフックに[クラスを含む]ファイルをロードするほうがよいでしょう。おそらくデフォルトの10
よりも低い優先順位でロードするのが最善です。以下では、デフォルトの優先度で実行されているコールバックで利用できるようにするために5
を使用します。優先順位を追加しない可能性があり、したがってコールバックが10
で実行され、エラーが(再度)スローされるため、これはユーザーにとってより安全です。
add_action( 'after_setup_theme', function()
{
require plugin_dir_path( __FILE__ ).'src/your-class.php`;
}, 5 );
それから、あなたのテーマのfunctions.php
ファイルで、あなたはただクラスに頼ることができます。また、コードの重複(および2か所での維持)を避け、パフォーマンスを低下させるだけの不要なclass_exists
チェックを必要としません。また、あなたのクラスが利用可能で使用準備ができている _であることも予測可能です。
現在の FIG PSR-4標準 では、ファイルごとに複数のクラスを使用することはできません(それ以外には何もありません)。あなたのコードは名前空間に対応しているので、これに従うことはあなたの設定をより将来の証拠にします。 (現在のPHPバージョンは5.6、5.3はサポート終了です)。