0

Wordpressのテーマから子のテーマを作成しています。親テーマは、次のように、functions.phpファイルでインスタンス化されるカスタムクラスに大きく依存しています。

<?php
require_once (TEMPLATEPATH . '/advanced/specialclass.php');

$specialclass = new SpecialClass();
if(!function_exists('lets_go')) {
    function lets_go(){
        global $specialclass;
        $specialclass->start();
    }
}

lets_go();
?>

子テーマのそのクラスの単一の関数をオーバーライドする必要があります。これは、子テーマのfunctions.phpファイルを作成することで実行しようとしました。私は次のいくつかのバリエーションを試しました:

<?php
require_once (TEMPLATEPATH . '/advanced/specialclass.php');
require_once (STYLESHEETPATH . '/advanced/specialclassextended.php');

global $specialclass;
$specialclass = new SpecialClassExtended();

function lets_go(){
    global $specialclass;
    $specialclass->start();
}

?>

たぶん私の問題はPHPグローバルを十分に理解していないことに関係していますが、それが何であれ、私は立ち往生しています。親テーマファイルには$specialclassへの参照が多数あるため、子テーマに新しいテンプレートファイルを作成してそれらすべてを置き換えることは実用的ではありません。そのグローバルを拡張クラスのインスタンスに置き換える必要があります。これは可能ですか?私は何が間違っているのですか?これまでのすべての検索で、これは私が見つけた最も密接に関連する情報ですが、残念ながら、それは私の特定の質問に答えていません:

https://wordpress.stackexchange.com/questions/30728/using-classes-instead-of-global-functions-in-functions-php

4

1 に答える 1

0

必ずしもこれをお勧めするわけではありませんが、サーバーへの管理アクセス権があり、PECL 拡張機能をインストールできる場合は、runkit_method_redefine()を使用できます。

それ以外の場合、実行可能な唯一のオプションは、そのテーマを変更することです。できることの 1 つは、SpecialClass の名前を SpecialClassBase のような名前に変更し、派生物の名前を SpecialClass の元の名前に変更することです。

ファイルの最後に独自の定義を含める場合は、他に何も変更する必要はありません。それはただ「うまくいく」はずです。

于 2013-03-06T06:25:15.973 に答える