web-dev-qa-db-ja.com

add_filter comment_edit_redirectが機能しない

私のプラグインでは、私はこの文を持っています

add_filter( 'comment_edit_redirect', 'mcd_return_link');

そしてこの機能

function mcd_return_link {
   return "edit-comments.php";
}

comments.php(コアファイル)の中には、このセクションのコードがあります(コメントを編集するセクションの中の310行目)(バージョン4.720)。

$location = ( empty( $_POST['referredby'] ) ? "edit-comments.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id;

/**
 * Filters the URI the user is redirected to after editing a comment in the admin.
 *
 * @since 2.1.0
 *
 * @param string $location The URI the user will be redirected to.
 * @param int $comment_id The ID of the comment being edited.
 */
$location = apply_filters( 'comment_edit_redirect', $location, $comment_id );
wp_redirect( $location );

add_filterの目的は、comments.phpファイルの$location値を変更して(adminの)コメントリスト画面に戻ることです。

だから私のプラグインはページに入力されているショートコードを使用しています

  • ショートコードはコメントのリストを作成し、各コメントはそのコメントの編集画面へのリンクを持っています(それはします)
  • 特定のコメントのコメント編集画面へのリンクがある
  • そのリンクをクリックすると、コメントの編集画面が表示されます。
  • 「更新」ボタンをクリックすると、edit-comments.phpページに戻ります(そうではありません)。

私のテストシステムでは、フィルタが適用されているかどうかをチェックするために、corecomments.phpapply_filters行の前後にコードを追加して$locationをエコーし​​ています。値。

両方の値(beforeとafter)は呼び出しページ(編集リンク付きのコメントを表示する私のページ)を示しています。 'edit-comments.php'ページにはリダイレクトされないため、フィルタは適用されていないようです。

add_filterの優先順位を7と15に変更しても効果はありません。

私はまた、フィルタが認識されるようにするために$wp_filterグローバル変数をダンプしました。

フィルタが適用されないのはなぜですか?

**(提案された回答の後に2月6日に編集)**

私はecho関数とwp_die()をフィルタ関数の中に追加しました。私はまた私のテストマルチサイトでこの問題のさらなるテストをしました。

  • プラグインが使用するショートコードは、マルチサイトテストシステムのメイン(サイト0)サブサイトのページにあります。
  • すべてのコメントへのリンクはコメントの編集URLに行きます
  • site 0サブサイト(このページにはすべてのサイトのコメントの一覧が表示されているページ)にコメントがあると、コメント編集画面に移動し、「update」と入力すると、フィルタによって定義されたページに戻ります。
  • site-1またはsite-0以外のサイトからのコメントリンクがあればコメント編集画面が表示されます。その後、 "update"を実行すると呼び出しページがリロードされます(コメントリストページ(ではなく意図どおり)
  • wp_die()をフィルタ関数(comments.phpの$ location設定を上書きして、目的の戻りページを設定する関数)に挿入すると、site-0の編集/更新プロセスは 'wp_die'メッセージを表示します。 site-1またはsite-2の編集/更新プロセスでは、 ' - wp_die'メッセージは表示されません

このことから、何らかの理由で、add-filterはsite-1またはsite-2のコメントへのリンクからは呼び出されず、site-0のコメントへのリンクから呼び出された場合には機能すると結論します。繰り返しますが、コメントを表示するページはsite-0です。

それで、それがsite-0できちんと動くとき、なぜadd-filterはsite-1かsite-2のためにコメント編集スクリーンに行くどんなリンクでも動かないのですか?

1
Rick Hellewell

別の質問を引き起こす答え...

プラグインがsite-1またはsite-2でアクティブではなく、site-2のコメントへのリンクをクリックすると、コメント編集画面に移動します。

しかし、プラグインはsite-1/site-2ではアクティブではないので(マルチサイト管理では 'network activated'であっても)、short-codeはsite-1/2ページでは機能せず、したがってadd_filter isn '実行されました。

そのため、コメントがあるサイトでプラグインが有効になっている場合に、コメントリンクの場合にのみadd_filterを実行する「filter-of-the-filter」が必要です。

しかし...これはなぜ私が持っている非常によく似たプラグイン(それは 'マルチサイトメディアディスプレイ'と呼ばれるすべてのサイトのすべてのメディアを表示する)を説明しないあなたがすることができます:

  • site-0のショートコードでページを実行する
  • すべてのサブサイトのすべてのメディアを表示
  • anyサブサイトのメディアを編集できます
  • メディア編集画面で「x」ボタンをクリックしてメディアリストに戻ると、メディア「リスト」画面が表示されます。

Media Editの 'x'には、どのページに戻りたいかを指定するコードがありません(310行目のcomments.phpの$ locationの値)。

しかし、ショートコードがsite-0で実行されたときに、コメントエディタがsite-1のadd_filterコマンドを「参照」しないのはなぜですか?

それで、別の質問を引き起こす答え…….

0
Rick Hellewell

注意してください、この種のadd_filterを避けてください。

add_filter( 'comment_edit_redirect', 'mcd_return_link');

常にパラメータの数を設定するようにしてください。それ以外の場合、デフォルトは1です。

add_filter( 'comment_edit_redirect', 'mcd_return_link', 10 , 2);
1
prosti

フィルタが適用されないのはなぜですか?

言いにくい。次のコードを追加してから、コメントを編集してみてください。これは基本的にあなたがすでに持っているものと同じものですが、2つのパラメータを持つ無名関数を使用しています。

add_filter( 'comment_edit_redirect', function( $location, $comment_id ) {
  wp_die( 'I\'m dead.' );
}, 10, 2 );

試してみたところ、期待通りの結果が得られたか、WordPressが死にました。

wp_die( 'I'm dead.' );return 'edit-comments.php';に変更すると、予想通り、コメントを編集した後にコメント編集ページにリダイレクトされます。

コールバックが正しく呼び出されていて(wp_dieテスト)、それでもフィルタが適用されていないように見える場合は、干渉する他のプラグイン/テーマ機能があるはずです。優先順位を999999のような非常に大きな値に変更してみてください。それでもうまくいかない場合は、デフォルトのテーマを使用しながら他のすべてのプラグインを無効にしてみてください。

1
Nathan Johnson