web-dev-qa-db-fra.com

Modifier la redirection de mise à jour de terme

Chaque fois que je mets à jour un terme, il me renvoie actuellement à la page edit-tags.php pour cette taxonomie, la liste de termes. Est-il possible au lieu de rediriger vers la liste des termes de me ramener au terme que je viens de mettre à jour? Semblable à la façon dont la mise à jour d'un message vous ramènera au même message que vous venez de mettre à jour.

Après avoir examiné le formulaire Modifier les balises à la surface, il ne semble pas y avoir de moyen de modifier l'action ou de changer sa direction, mais après avoir examiné les URL, il semble que la redirection se base sur les paramètres $_GET. Par exemple, une url de liste de taxonomie ressemble à ceci:

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

Et chaque fois que vous modifiez un terme, il passe simplement l'ID de la balise:

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

Il me faudrait donc trouver un filtre sur la page de modification du terme qui transmette le même identifiant de terme que celui que l'utilisateur actuel modifie. Comment pourrais-je m'y prendre pour y parvenir? Suggestions sur les filtres?

3
Howdy_McGee

Je suis d’accord avec vous, c’est un peu une expérience inattendueutilisateur, lorsque vous êtes redirigé après la mise à jour d’un terme.

De plus, il semble n'y avoir aucune gestion d'erreur sur le formulaire lui-même. Si vous essayez de faire certaines erreurs, telles que la suppression du terme nom et slug, aucune erreur ne s'affichera, ignorez simplement vos modifications et redirigez.

Vous pouvez essayer ce qui suit pour rester sur la même page de modification après la mise à jour:

/**
 * 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;
    }
);

où vous devez modifier la valeur $mytaxonomy selon vos besoins.

Vous pouvez également ajouter un lienGo backau formulaire, par exemple:

/**
 * 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' ) );
    }
);

où nous utilisons le hook {$taxonomy}_edit_form. Il serait probablement plus logique d’ajouter le lien directement sous le bouton Soumettre, ou dans la même ligne, pas au-dessus de celui-ci comme nous le faisons ici, mais je n’ai trouvé aucun crochet approprié pour cela. Vous pouvez bien sûr utiliser CSS pour changer la position du lien.

3
birgire

Merci @birgire pour la solution, j'ai modifié le code ci-dessus pour mon besoin. Maintenant, nous n’avons pas besoin de mentionner une taxonomie ou un type de poste spécifique, mais cela fonctionnera pour toutes les taxonomies publiques construites et personnalisées. Je l'ai testé avec le type de message personnalisé et les taxonomies.

Il vous suffit de le copier dans le fichier functions.php du thème enfant et de modifier tout terme de taxonomie ou terme de taxonomie intégrée, par exemple des catégories ou des balises à vérifier.

/**
 * 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