web-dev-qa-db-ja.com

プラグイン設定を更新した後に管理通知を表示するにはどうすればいいですか?

設定ページ付きのプラグインがあり、特定のオプションが保存されたときに実行する必要があるアクションがいくつかあります。これを行うにはpre_update_option_フックを使用しています。ここまでは順調ですね。ただし、問題が発生した場合は、そのことをユーザーに通知する必要もあります。私はこれらのことを試しました:

1)コードを更新する前にadmin_noticesにフックを追加してください

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( 'correct_value' == $new_value );

    if ( !$valid ) add_action('admin_notices', 'my_notification_function' )
    return ($valid)? $new_value : $old_value;
});

検証は機能しますが、通知は表示されません。それまでに、admin_noticesにフックされている関数が既に実行されているからです。

2)admin_noticesにフックされた関数の検証上記の問題を解決するために、私はこの考えを持っていました。

add_action('admin_notices', function () {

      //Do my validation
      $valid = ( 'correct_value' == $_POST['my_var'] );
      if (!$valid) { /* Display error message */ }
      //Store the value of $valid
});

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //fetch the value of $valid which I stored 
    return ($valid)? $new_value : $old_value;
});

今、これはうまくいくように思えます、私は今通知を見ます。問題は、奇妙な理由で投稿された値が表示されないことです。 $_POSTを印刷しようとしましたが、常に空です。おそらくWordPressは他の方法で値を渡していますか?もしそうなら、どうですか?

どちらが正しい方法ですか。問題を解決するにはどうすればよいですか。もちろん、他の方法がこれら2つの方法よりも優れていて問題を解決できれば、それは大歓迎です。

4
DavidTonarini

設定APIを調べたところ、答えが見つかりました。方法1は正しかったが、通知はadmin_noticesにフックすることによってではなく、関数 add_settings_error によって行われるべきではない

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( 'correct_value' == $new_value );

    if ( !$valid ) {
         //This fixes the issue
         add_settings_error( 'my_var', $error_code, $message );
    }
    return ($valid)? $new_value : $old_value;
});

それらを表示するためには、これも設定ページの最初に追加する必要があります。

<h2>The heading of my settings page</h2>
<?php settings_errors(); ?>
3
DavidTonarini

いいえ、あなたは間違っています。 add_actionはプラグインオブジェクトの__construct()になければなりません。これが私の小さなプラグイン WOOFのCategory からの抜粋です。wordpress.orgからコード全体をダウンロードできます。

public function __construct() {
    //...
    add_action( 'admin_notices', array( $this, 'wbc_plugin_not_found' ) );
    //...
}

私のコードでは、条件をチェックし(検証 - あなたの場合)、wbc_requirements_met()を介して結果を返します。結果が偽の場合、通知メッセージをwbc_admin_messageで追加します

public function wbc_plugin_not_found() {
    if ( $this->wbc_requirements_met() ) {
        return;
    }

    $message = __( 'WOOF by Category plugin requires the following plugins installed and activated: ', 'woof-by-category' );
    //...
    $this->wbc_admin_message( $message, 'error notice is-dismissible' );
    }

private function wbc_admin_message( $message, $class ) {
    ?>
    <div class="<?php echo esc_attr( $class ); ?>">
        <p>
            <span style="display: block; margin: 0.5em 0.5em 0 0; clear: both;">
            <?php echo wp_kses( $message, wp_kses_allowed_html( 'post' ) ); ?>
            </span>
        </p>
    </div>
    <?php
}
1
KAGG Design

私は数ヶ月前に同じ問題にぶつかりました。カスタム投稿タイプのいくつかのカスタムフィールドで行った特定の検証に基づいて管理者への通知を表示する必要がありました。

私の検証はpre_saveフックで行われたので、問題は「そのフックが起動した後にブラウザが更新される」ということです。

そこで私はJohn Oleksowiczによるクラスを見つけました。これは基本的に管理者への通知をオプションテーブルに格納し、不要なときはクリアします。

それはと呼ばれています: 簡単なWordPress管理者への通知

クラスはかなり単純明快で、あなたはただプラグインを使うことができます。私の場合は、このクラスを使用し、管理メッセージ関数を呼び出す方法を変更することによってクラスを調整しました。

だから今、私はちょうど私がやった管理者通知をトリガーする必要があるときはいつでも:

planner_notices_add_error( $message );
1
Armando Duran

Wordpressの管理者向けの通知用に小さなライブラリを作成しました。 https://gitlab.com/wpdesk/wp-notice

管理通知を表示するのは、新しいオブジェクトを作成するのと同じくらい簡単です。

$notice = new \WPDesk\Notice\Notice( 'info', 'Notice text goes here' );

0
Grzegorz Rola