web-dev-qa-db-ja.com

却下可能な通知状態をに保存する方法 WP 4.2?

WordPress 4.2is-dismissibleクラスは通知を却下できるようにするために導入されました。

このコードは通知を追加するためのものです。

function prefix_deprecated_hook_admin_notice() {
    if ( has_filter( 'prefix_filter' ) ) { ?>
        <div class="updated notice is-dismissible">
            <p><?php _e( 'Notice', 'my-text-domain' ); ?></p>
        </div>
    <?php }
}
add_action( 'admin_notices', 'prefix_deprecated_hook_admin_notice' );

通知を却下することはできますが、通知がAJAXで却下されたときに状態を保存する方法がわからない場合があります。

6
grappler

私が見つけた最良の解決策は小さな図書館でした。 https://github.com/CalderaWP/dismissible_notice

WordPress 3.8までは下位互換性があります。

0
grappler

ライブラリは必要ありません。達成するのはかなり簡単です。あなたがあなた自身のプラグインをコーディングしているなら(それはあなたがそうであるように見えます)、そしてあなたはかなり軽量な方法でこれをすることができます:

通知を少し修正したもので、表示前に却下されたかどうかをチェックし、javascriptにアクセスするための通知の「タイプ」をマークアップに格納します。

function prefix_deprecated_hook_admin_notice() {
    if ( has_filter( 'prefix_filter' ) ) { 
        // Check if it's been dismissed...
        if ( ! get_option('dismissed-prefix_deprecated', FALSE ) ) { 
            // Added the class "notice-my-class" so jQuery pick it up and pass via AJAX,
            // and added "data-notice" attribute in order to track multiple / different notices
            // multiple dismissible notice states ?>
            <div class="updated notice notice-my-class is-dismissible" data-notice="prefix_deprecated">
                <p><?php _e( 'Notice', 'my-text-domain' ); ?></p>
            </div>
        <?php }
    }
}

add_action( 'admin_notices', 'prefix_deprecated_hook_admin_notice' );

そして、次のjQuery

  // shorthand no-conflict safe document-ready function
  jQuery(function($) {
    // Hook into the "notice-my-class" class we added to the notice, so
    // Only listen to YOUR notices being dismissed
    $( document ).on( 'click', '.notice-my-class .notice-dismiss', function () {
        // Read the "data-notice" information to track which notice
        // is being dismissed and send it via AJAX
        var type = $( this ).closest( '.notice-my-class' ).data( 'notice' );
        // Make an AJAX call
        // Since WP 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
        $.ajax( ajaxurl,
          {
            type: 'POST',
            data: {
              action: 'dismissed_notice_handler',
              type: type,
            }
          } );
      } );
  });

PHPでは、AJAX呼び出しをキャプチャするためにAJAXフックを設定します。

add_action( 'wp_ajax_dismissed_notice_handler', 'ajax_notice_handler' );

/**
 * AJAX handler to store the state of dismissible notices.
 */
function ajax_notice_handler() {
    // Pick up the notice "type" - passed via jQuery (the "data-notice" attribute on the notice)
    $type = self::request( 'type' );
    // Store it in the options table
    update_option( 'dismissed-' . $type, TRUE );
}

以上です!特にPHPやJavaScriptファイルを読み込んでいる場合は、ライブラリは必要ありません。

この方法は WordPress Core devチームのブログにあります

4
cale_b