web-dev-qa-db-ja.com

用語更新のリダイレクトを変更する

用語を更新するたびに、現在その分類法のedit-tags.phpページ、用語リストにリダイレクトされます。代わりに用語リストにリダイレクトして、更新したばかりの同じ用語に戻すことはできますか。投稿を更新すると、更新したのと同じ投稿に戻るのと同様です。

表面上の タグの編集フォーム を見た後では、アクションを変更したり進行方向を変更する方法がないように見えますが、実際に見た後はURLでは$_GETパラメータに基づいてリダイレクトしているようです。たとえば、分類リストのURLは次のようになります。

/wp-admin/edit-tags.php?taxonomy=taxonomy_name&post_type=type_name

そして用語を編集するときはいつでも、それは単に 'tag' IDを渡します:

/wp-admin/edit-tags.php?action=edit&taxonomy=taxonomy_name&tag_ID=123&post_type=type_name

そのため、現在のユーザーが編集しているのと同じ用語IDを渡す、用語の編集ページでフィルタを見つける必要があります。これを達成するにはどうすればよいでしょうか。フィルタに関する提案は?

3
Howdy_McGee

私はあなたに同意します、あなたが用語を更新した後にあなたが向け直されるとき、それは幾分予想外のユーザー経験です。

さらに、フォーム自体にはエラー処理がないようです。名前やスラッグを削除するなどのエラーを発生させようとしても、エラーは表示されず、変更を無視してリダイレクトします。

更新後も同じ用語の編集ページに移動するには、次の方法を試してください。

/**
 * Stay on the edit term page after updating.
 * @see http://wordpress.stackexchange.com/a/168206/26350
 */

add_filter( 'wp_redirect', 
    function( $location ){
        $mytaxonomy = 'post_tag'; # <-- Edit this to your needs!
        $args = array(
            'action'   => FILTER_SANITIZE_STRING,
            'taxonomy' => FILTER_SANITIZE_STRING,
            'tag_ID'   => FILTER_SANITIZE_NUMBER_INT,
        );
        $_inputs    = filter_input_array( INPUT_POST, $args );
        $_post_type = filter_input( INPUT_GET, 'post_type', FILTER_SANITIZE_STRING );
        if( 'editedtag' === $_inputs['action'] 
            && $mytaxonomy === $_inputs['taxonomy']
            && $_inputs['tag_ID'] > 0
        ){
            $location = add_query_arg( 'action',   'edit',               $location );
            $location = add_query_arg( 'taxonomy', $_inputs['taxonomy'], $location );
            $location = add_query_arg( 'tag_ID',   $_inputs['tag_ID'],   $location );
            if( $_post_type )
                $location = add_query_arg( 'post_type', $_post_type, $location );
        }
        return $location;
    }
);

必要に応じて$mytaxonomy値を変更する必要があります。

また、戻るリンクをフォームに追加することもできます。次に例を示します。

/**
 * Add a "Go back" link to the post tag edit form.
 * @see http://wordpress.stackexchange.com/a/168206/26350
 */

add_action( 'post_tag_edit_form',
    function( $tag ) {
        $url = admin_url( 'edit-tags.php' );
        $url = add_query_arg( 'tag_ID',   $tag->term_id, $url );
        $url = add_query_arg( 'taxonomy', $tag->taxonomy, $url );
        printf( '<a href="%s">%s</a>', $url, __( 'Go back' ) );
    }
);

ここでは{$taxonomy}_edit_formフックを使います。送信ボタンの真下、または同じ行にリンクを追加するほうがおそらく理にかなっているでしょうが、ここで行うような適切なフックは見つかりませんでした。もちろん、CSSを使ってリンクの位置を変更することもできます。

3
birgire

解決のための@birgireのおかげで、私は私の必要性のために上記のコードを修正しました。今、私たちは特定の分類法やポストの種類について言及する必要はなく、代わりにこれはすべてのbuilt_inおよびカスタムのパブリック分類法で機能します。カスタムの投稿タイプと分類法でテストしました。

単にそれをchild-theme functions.phpにコピーして、チェックするための分類やタグなどの分類用語や作り付けの分類用語を編集してください。

/**
 * Stay on the edit term page after updating.
 * Work for any post type and all custom/built_in taxonomies
 */

add_filter( 'wp_redirect', 
    function( $location ){
            $args = array(
              'public'   => true,
              '_builtin' => true

            ); 
        $taxonomy = get_taxonomies($args); //get all taxonomies
        foreach ($taxonomy  as $mytaxonomy) {
            $args = array(
                'action'   => FILTER_SANITIZE_STRING,
                'taxonomy' => FILTER_SANITIZE_STRING,
                'tag_ID'   => FILTER_SANITIZE_NUMBER_INT,
            );
            $_inputs    = filter_input_array( INPUT_POST, $args );
            $_post_type = filter_input( INPUT_GET, 'post_type', FILTER_SANITIZE_STRING );
            if( 'editedtag' === $_inputs['action'] 
                or $mytaxonomy === $_inputs['taxonomy']
                or $_inputs['tag_ID'] > 0
            ){
                $location = add_query_arg( 'action',   'edit',               $location );
                $location = add_query_arg( 'taxonomy', $_inputs['taxonomy'], $location );
                $location = add_query_arg( 'tag_ID',   $_inputs['tag_ID'],   $location );
                if( $_post_type )
                    $location = add_query_arg( 'post_type', $_post_type, $location );
            }
            return $location;
        }
    }
);
0
Jamil Ahmed