web-dev-qa-db-ja.com

他のプラグインによって保存されたすべてのオプションを取得する

私は他のプラグインから設定をインポート/エクスポートする可能性を追加するプラグインを開発しています。しかし、そのプラグインによって保存されたオプションIDにアクセスすることはできません。

特定のプラグインによってすべてのオプションを保存することは可能ですか?

私が欲しいのはこのようなものです。

get_plugin_options($pluginId); // returns all options ids in a array or similar

私はプラグインコードを見てオプション名を書き留めることが可能であることを知っています...しかし、ハードコーディングされたオプション名は素晴らしいものではないでしょう。

ありがとうございます。

2
Caio_V

あなたの最良の選択は検索に使用するためにあなたのプラグインにすべての名前をコピーすることです。もちろん、これはプラグインが更新されたときに変わる可能性があります。 update_option()を使用してオプションがデータベースに保存されるとき、それらがどのプラグインから来たのかの表示はどこにも保存されません。ただし、すべてのオプションで特定のプレフィックスを使用する場合は、そのプレフィックスに基づいてオプションテーブルからそれらを取得するためのSQLクエリを作成できます。

たとえば、プラグインのすべてのオプションの接頭辞が 'abcd_'の場合は、次のようなクエリを使用できます。

select * from $wpdb->options where option_name like 'abcd_%'
2
Amanda Giles

プラグインによってすでに保存されているオプションに関するデータを取得することはできませんが、add_optionupdate_option、およびおそらくget_optionアクティビティを監視して、どのプラグインがどのオプションを使用しているかを単純なバックトレースで調べます。私はあなたのために小さな断片をまとめました:

function gimme_your_options( $option_name ) {
    $blame = 'core';
    $debug_backtrace = debug_backtrace();
    foreach ( $debug_backtrace as $call ) {
        if ( empty( $call['file'] ) )
            continue;

        if ( ! preg_match( '#wp-content/((?:(?:mu-)?plugins|themes)/.+)#i', $call['file'], $matches ) )
            continue;

        $blame = $matches[1];
        break;
    }

    error_log( sprintf( 'blame %s for %s', $blame, $option_name ) );
}

add_action( 'add_option', 'gimme_your_options' );
add_action( 'update_option', 'gimme_your_options' );

Jetpackをバスの中に投げ込まないようにしてください。しかし、これが私のerror.logの中の応答の例です:

[23-Mar-2015 05:39:27 UTC] blame core for active_plugins
[23-Mar-2015 05:39:27 UTC] blame core for _transient_doing_cron
[23-Mar-2015 05:39:27 UTC] blame core for cron
[23-Mar-2015 05:39:27 UTC] blame core for cron
[23-Mar-2015 05:39:28 UTC] blame plugins/jetpack/class.jetpack.php for _transient_timeout_jetpack_https_test
[23-Mar-2015 05:39:28 UTC] blame plugins/jetpack/class.jetpack.php for _transient_jetpack_https_test
[23-Mar-2015 05:39:28 UTC] blame plugins/jetpack/class.jetpack-options.php for jetpack_options

それが役立つことを願っています。

また、例えばプラグインがcronスケジュールを追加した場合、その関数はcronオプションにアクセスするために非難されるものになりますが、プラグインはそうではありませんそのオプションを所有します。

2
kovshenin

私はこれが可能であるとは思わないか、またはこれのための普遍的な機能が存在すると思います。オプションを追加するときはいつでも、option_nameおよびoption_value - add_option() を追加することによってそれを行います。

<?php add_option( $option, $value, $deprecated, $autoload ); ?>

そのため、プラグインがそれらのオプションをデータベースに追加するときはいつでも、それらはその関数を使用し、通常プラグインがwpseo_option_nameまたはwoocommerce_option_nameの後にオプションが続くものでオプション名を付けます。開発者とそのドキュメンテーションだけが彼らが作成したオプションを追跡します、WordPressは実際にはそうではありません。他のプラグイン、ユーザー、そしてWordPress自身によって作成された他のすべてのオプションと共にそれらを取り込むだけです。

あなたは手動でそれらが使っているすべてのオプション名を見つけなければならないでしょう。ifそれらは接頭辞を使っていて、それぞれのオプションをループします:$prefix_$option_name

0
Howdy_McGee