web-dev-qa-db-fra.com

Suppression du format de message (type)

Je me suis retrouvé en train d'essayer de supprimer le slug de format de publication, afin que je puisse avoir exemple.com/video pour la section vidéo au lieu de exemple.com/type/video.

D'habitude c'est fait comme ça:

add_action( 'init', 'custom_format_permalinks', 1 );
function custom_format_permalinks() {
   $taxonomy = 'post_format';
   $post_format_rewrite = array(      'slug' => NULL,      );
   add_permastruct( $taxonomy, "%$taxonomy%", $post_format_rewrite );
}

Ou simplement:

add_filter('post_format_rewrite_base', 'post_format_base');
function post_format_base($slug) {return '/';}

Ce sont les réponses typiques données ailleurs pour cette question. Et ils font tous les deux leur travail, sauf que ... la pagination et les flux ne fonctionnent plus.

Puis j'ai essayé cette voie ...

add_filter('post_format_rewrite_base', 'no_format_base_rewrite_rules');
function no_format_base_rewrite_rules($format_rewrite) { 
$format_rewrite = array();    
$formats = get_post_format_slugs();    
foreach($formats as $format_nicename => $key) {
    $format_rewrite['('.$format_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?post_format=$matches[1]&feed=$matches[2]';
    $format_rewrite['('.$format_nicename.')/?([0-9]{1,})/?$'] = 'index.php?post_format=$matches[1]&paged=$matches[2]';
    $format_rewrite['('.$format_nicename.')/?$'] = 'index.php?post_format=$matches[1]';
    }      
return $format_rewrite;
}

Il a été prouvé que ce type d’approche fonctionne parfaitement avec les catégories, les balises ou les auteurs, mais pour une raison quelconque, il ne fait pas le travail pour le moment. Quel pourrait être le problème?

2
Lucian Davidescu

Excellente réponse ci-dessus, vaut bien la prime. Pour mémoire, voici à quoi cela a conduit:

add_filter( 'post_format_rewrite_rules', 'no_format_base_rewrite_rules' );
function no_format_base_rewrite_rules( $format_rewrite ) {

    $format_rewrite = array(); 
    $formats = get_post_format_slugs();

    foreach($formats as $format_nicename) {
        $format_rewrite['(' . $format_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?post_format=$matches[1]&feed=$matches[2]';
        $format_rewrite['(' . $format_nicename . ')/?([0-9]{1,})/?$'] = 'index.php?post_format=$matches[1]&paged=$matches[2]';
        $format_rewrite['(' . $format_nicename . ')/?$'] = 'index.php?post_format=$matches[1]';
    }

    return $format_rewrite;
}
1
Lucian Davidescu

Dans votre dernier exemple de code, vous retournez un type incorrect pour le post_format_rewrite_base. Ce devrait être une chaîne, pas un tableau. Cependant, votre idée va dans la bonne direction.

Vous devez prendre en compte tous les "itinéraires" impliqués par les règles de réécriture par défaut créées par WordPress pour les formats de publication:

type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$ => index.php?post_format=$matches[1]&feed=$matches[2]
type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$      => index.php?post_format=$matches[1]&feed=$matches[2]
type/([^/]+)/embed/?$                         => index.php?post_format=$matches[1]&embed=true
type/([^/]+)/page/?([0-9]{1,})/?$             => index.php?post_format=$matches[1]&paged=$matches[2]
type/([^/]+)/?$                               => index.php?post_format=$matches[1] 

Pourquoi ne pas utiliser Cortex ? Il vous permet de mapper des itinéraires directement aux paramètres de requête. Voici un exemple d'utilisation.

<?php

use
    Brain\Cortex,
    Brain\Cortex\Route;


add_action( 'wp_loaded', function() {

    Cortex::boot();

    $post_format_slugs = get_post_format_slugs();
    $post_format_slugs_pattern = implode( '|', $post_format_slugs );
    add_action(
        'cortex.routes',
        function ( Route\RouteCollectionInterface $collection ) use ( $post_format_slugs_pattern ) {
            /**
             * Default route for post format slugs
             *
             * /(standard|aside|chat|gallery|...)
             */
            $collection->addRoute(
                new Route\QueryRoute(
                    "/{slug:{$post_format_slugs_pattern}}",
                    function( $matches ) {

                        return [
                            'post_format' => $matches[ 'slug' ]
                        ];
                    }
                )
            );
            /**
             * Route for feed endpoints 1
             *
             * /(standard|aside|chat|gallery|...)/feed/(feed/rdf/rss/rss2/atom)
             */
            $collection->addRoute(
                new Route\QueryRoute(
                    "/{slug:{$post_format_slugs_pattern}}/feed/{feed:feed|rdf|rss|rss2|atom}",
                    function( $matches ) {

                        return [
                            'post_format' => $matches[ 'slug' ],
                            'feed'        => $matches[ 'feed' ]
                        ];
                    }
                )
            );
            /**
             * Route for feed endpoints 2
             *
             * /(standard|aside|chat|gallery|...)/(feed/rdf/rss/rss2/atom)
             */
            $collection->addRoute(
                new Route\QueryRoute(
                    "/{slug:{$post_format_slugs_pattern}}/{feed:feed|rdf|rss|rss2|atom}",
                    function( $matches ) {

                        return [
                            'post_format' => $matches[ 'slug' ],
                            'feed'        => $matches[ 'feed' ]
                        ];
                    }
                )
            );
            /**
             * Route for embed
             *
             * /(standard|aside|chat|gallery|...)/embed
             */
            $collection->addRoute(
                new Route\QueryRoute(
                    "/{slug:{$post_format_slugs_pattern}}/embed",
                    function( $matches ) {

                        return [
                            'post_format' => $matches[ 'slug' ],
                            'embed'       => TRUE
                        ];
                    }
                )
            );
            /**
             * Route for pagination
             *
             * ^/(standard|aside|chat|gallery|...)/page/(\d+)$
             */
            $collection->addRoute(
                new Route\QueryRoute(
                    "/{slug:{$post_format_slugs_pattern}}/page/{page:[0-9]+}",
                    function( $matches ) {

                        return [
                            'post_format' => $matches[ 'slug' ],
                            'paged'       => $matches[ 'page' ]
                        ];
                    }
                )
            );
        }
    );
} );

Cortex a l'avantage de ne pas avoir à effacer les règles de réécriture. En interne, il utilise FastRoute pour faire correspondre les modèles, de sorte que vous pouvez utiliser n'importe quel langage de modèle, FastRoute fournit. Cortext n'écrase pas le processus de routage interne de WordPress, il agit juste avant et transmettra la demande à WordPress si aucune route ne correspond.

L'exemple montre simplement comment utiliser Cortex. Certaines routes peuvent éventuellement être combinées ou même supprimées car elles ne servent qu’à des fins de compatibilité ascendante (en particulier les routes d’alimentation redondantes).

N'oubliez pas que votre concept nécessite des itinéraires qui se chevauchent, ce qui signifie que vous ne pourrez pas créer de pages avec les termes du format de publication: standard, de côté, chat, galerie, lien, image, citation, statut, vidéo, audio.

Vous souhaiterez peut-être implémenter une vérification automatisée qui affecte la génération unique post-slug:

add_filter( 'wp_unique_post_slug_is_bad_hierarchical_slug', function( $is_bad, $slug, $post_type, $post_parent ) {
    if ( 'page' !== $post_type ) 
        return $is_bad;

    return in_array( $slug, get_post_format_slugs() );
} );

Une autre optimisation consisterait à utiliser uniquement les slugs au format courrier, que le thème actuel prend en charge. Mais cela invalidera les URL existantes au cas où le thème changerait.

Si vous ne souhaitez pas utiliser Cortex, le principe serait à peu près le même, mais vous devrez supprimer manuellement les règles de post-formatage par défaut et les remplacer par règles de réécriture personnalisées qui suivent le schéma des itinéraires mentionnés ci-dessus. . N'oubliez pas de ne faire cela que sur un hook d'activation puis de vider les règles de réécriture à mesure qu'elles sont mises en cache dans la base de données.

4
David