Eliminación de la barra de formato (tipo) de publicación

2

Me quedé atascado al intentar eliminar la barra de formato de publicación, por lo que podría tener, por ejemplo, example.com/video para la sección de video en lugar de example.com/type/video.

Por lo general, se hace así:

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

O simplemente:

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

Estas son las respuestas típicas dadas en otros lugares para esta pregunta. Y ambos hacen el trabajo, excepto que ... la paginación y las fuentes ya no funcionan.

Entonces probé esta ruta ...

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;
}

Se ha comprobado que este tipo de enfoque funciona perfectamente con categorías, etiquetas o autores, pero por alguna razón, esta vez no hace el trabajo. ¿Qué podría estar mal?

    
pregunta Lucian Davidescu 09.08.2016 - 03:05

2 respuestas

1

Excelente respuesta arriba, bien vale la pena la recompensa. Para el registro, esto es lo que llevó a:

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;
}
    
respondido por el Lucian Davidescu 12.08.2016 - 13:49
4

En el último ejemplo de código, estás devolviendo un tipo incorrecto para el post_format_rewrite_base . Debe ser una cadena, no una matriz. Sin embargo, su idea va en la dirección correcta.

Tienes que cuidar todas las «rutas» que están implícitas en las reglas de reescritura predeterminadas que WordPress crea para los formatos de publicación:

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] 

¿Qué te parece usar Cortex ? Le permite asignar rutas directamente a los parámetros de consulta. Aquí hay un ejemplo de cómo usarlo.

<?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 tiene la ventaja de que no tiene que vaciar las reglas de reescritura. Internamente utiliza FastRoute para que coincida con los patrones, por lo que puede usar cualquiera de los lenguajes de patrones, FastRoute proporciona. Cortext no sobrescribe el proceso de enrutamiento interno de WordPress, simplemente actúa justo antes y pasará la solicitud a WordPress si no coincide la ruta.

El ejemplo muestra la esencia de cómo usar Cortex. Algunas rutas podrían combinarse o incluso eliminarse, ya que son solo para compatibilidad con versiones anteriores (especialmente las rutas de alimentación redundantes).

Recuerde que su concepto requiere rutas superpuestas, lo que significa que no podrá crear páginas con ninguna de las condiciones del formato de publicación: estándar, aparte, chat, galería, enlace, imagen, presupuesto, estado, video , audio.

Es posible que desee implementar una comprobación automatizada que afecte a la generación única de slug post:

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() );
} );

Otra optimización sería utilizar solo las babosas de formato posterior, el tema actual realmente es compatible. Pero esto invalidará las URL existentes en caso de que el tema cambie.

Si no desea utilizar Cortex, el principio sería prácticamente el mismo, pero tendría que eliminar manualmente las reglas de formato de publicación predeterminadas y reemplazarlo por reglas de reescritura personalizadas que siguen el esquema de las rutas mencionadas anteriormente. Recuerde hacer esto solo en un gancho de activación y luego volver a escribir las reglas a medida que se almacenan en caché en la base de datos.

    
respondido por el David 11.08.2016 - 09:05

Lea otras preguntas en las etiquetas