web-dev-qa-db-ja.com

ユーザーがその特定のページを離れると消えるadmin_noticesメッセージを作成する方法

Admin_noticesの助けを借りるのは簡単です。

  • 管理画面に恒久的に表示する
  • 特定の種類のページが表示されたときにのみ表示
  • ユーザーがそれを閉じるまで表示する

しかし、私はユーザーがその特定のページを離れるまで表示されるメッセージを作成することで助けを見つけることができません。すなわち。 正確に WordPressがそのPost updated. View post.メッセージで日常的に示していること。

enter image description here

あなたが先に進むことを決心するまであなたはそのメッセージを見るだけです、あなたはそれを再び見ることはなく、そしてあなたは積極的にそれを消す必要はありません。

これが私たちがこれまでに持ってきたものです(これは恒久的なメッセージを作成します、明らかにこれは私たちが探している控えめなメッセージからは程遠いです):

function my_admin_notice() {
?>
<div class="updated">
    <p><?php _e( 'Updated!', 'my-text-domain' ); ?></p>
</div>
<?php
}
add_action( 'admin_notices', 'my_admin_notice' );
4
hawbsl

簡単な答えは: クエリ文字列を使用する。

投稿を公開した直後にアドレスバーに気付いた場合は、次のようなものが表示されます。domain.com/wp-admin/post.php?post=4935&action=edit&message=6

いくつかの異なるクエリ変数があります。

  1. postは編集中の投稿のIDを含みます。
  2. actionは、現在Postを "編集中"だと言っています。
  3. messageは、投稿に対して何が行われたかに応じて表示される管理通知を表します。

デフォルトの投稿タイプのメッセージの表示例と、カスタム投稿タイプに合わせてメッセージをカスタマイズする方法(管理者向けの通知)については、/ ここ を参照してください。

上記の例はカスタム投稿タイプを基準にしており、WordPressはすべての条件を処理します。メッセージをカスタマイズするだけです。

例えばあなたのプラグインのためのカスタム設定ページでこれをしたいと思うなら。あなたは同じことを達成するためにいくつかのステップを踏む必要があるでしょう。

ナットシェルの場合:

URLに追加のクエリ変数を追加して、ユーザーをカスタム設定ページに送信します。

admin_notices にフックします。

admin_noticesフックに指定するコールバック関数の中には、メッセージの配列があります。ここで、配列キーはクエリ変数の値と一致し、配列値は適切なメッセージになります。

クエリ変数が存在するかどうかを確認してください。 (ユーザーがプラグインの設定ページにいることを確認してください。 get_current_screen(); - それ以外の場合は、すべての管理ページでグローバルに確認されます。)

クエリ変数のさまざまな値に対して追加の条件チェックを実行し、クエリ変数の値に応じて適切な管理者通知を表示します。

だから基本的に:

  • ユーザーがプラグインの設定ページにいるかどうかを確認してください。
  • クエリ変数が存在するかどうかを確認してください。
  • クエリ変数の値が予想されるものの値と一致するかどうかを確認します。
  • メッセージ配列内の配列キーを使用してクエリ変数から一致すると予想される値に応じて適切なメッセージを選択します。
  • メッセージ配列キーから一致したメッセージを含む管理通知を表示します。
6
Michael Ecklund

この答えはあなたがポストエディットスクリーンでこれをしたいと思うと仮定します。

説明:

基本的には、いくつかの条件が必要です。

  1. 特定の管理画面に対処するには

  2. 特定のページが表示されるまでメッセージを表示するには:

さらに - もちろん - admin_notices フックの使い方。そして以下の例では save_post フックです。

例:

function wpse183752_the_admin_notice() {
    // get screen information
    $screen = get_current_screen();
    // screen condition    
    // TODO: change to the screen you want to address
    if ( $screen->id != 'post' ) {
        return;
    }
    // query variable condition
    if ( ! isset( $_GET[ 'the_message' ] ) || $_GET[ 'the_message' ] != 'show' ) {
        return;
    }
    ?>
    <div class="updated">
        <p>
            <?php _e( 'The Message', 'the-text-domain' ); ?>
        </p>
    </div>
    <?php
}
add_action( 'admin_notices', 'wpse183752_the_admin_notice' );

function wpse183752_the_message( $old_query_string ) {
    // add the new query variable
    $new_query_string = add_query_arg( 'the_message', 'show', $old_query_string );
    // return the new query string
    return $new_query_string;
}

function wpse183752_set_message_variable() {
    // usage of wpse183752_the_message() callback with redirect_post_location
    // to setup the query variable on a hook, here save_post
    add_filter( 'redirect_post_location', 'wpse183752_the_message' );
}
// TODO: change to the hook you need
add_action( 'save_post', 'wpse183752_set_message_variable' );

注意:

上記の例はかなり一般的なものです。内蔵の投稿タイプ投稿の投稿編集画面に対応しています。上の例のToDoを参照してください。あなたが 自分で言った あなたはおそらくpublish_mycptタイプのフックである{status}_{post_type}に対処したいと思うでしょう。詳細は Codex:Post Status Transitions を見てください。

2
Nicolai

私はあなたが何をしているのか理解していませんが、CPTポストパブリッシュ中にオプション(add_option)を追加し、そしてそのオプションの存在を確認し、もしあれば通知を表示することが可能でしょう。あなたが通知を表示しなければならない機能の中で、あなたはそれが再び表示されるのを止めるオプションを削除することもできます。

あるいは、ユーザーメタを追加して通知が表示されたら削除する - 単一のユーザーのみをターゲットにしている場合は最適なオプション

0
Mike