Redeclare / Cambie Slug del tipo de publicación personalizada de un complemento

28

¿Es posible volver a declarar / cambiar el slug del tipo de publicación personalizada existente de un complemento (sin simplemente editar el complemento)?

Es decir, si el complemento X crea un tipo de publicación personalizado con slug / uncookedtoast /, ¿es posible agregar un filtro a functions.php (o algo similar) que cambie el slug a / bread /?

Edbury
fuente
Acabo de resolver este mismo problema conectando init con una prioridad de 20 y luego llamando a register_post_type nuevamente para el mismo tipo de publicación. ¿Alguien sabe si esto me va a causar algún problema en el futuro?
Dustin

Respuestas:

24

Sí, esto es posible, pero si el complemento está creando un tipo de publicación personalizada utilizando el rewrite => array('slug' => 'post_type')parámetro, entonces no es probable que pueda reemplazar la babosa.

Cada vez que se crean tipos de publicaciones personalizadas, las reglas de reescritura de URL se escriben en la base de datos. Dependiendo de qué acción desencadena la creación del tipo de publicación personalizada (como la acción init ), WordPress vaciará las reglas de reescritura y restaurará las babosas del tipo de publicación personalizada independientemente de los cambios que intente realizar.

Dicho esto, puede proporcionar babosas personalizadas para los tipos de publicaciones personalizadas. El siguiente ejemplo supone que tiene un tipo de publicación personalizado moviesy que está intentando cambiar la /movies/babosa a /films/.

Para completar, aquí está la función básica utilizada para definir el moviestipo de publicación personalizada. El complemento al que hace referencia debería hacer algo como esto:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Puede modificar la tabla de opciones proporcionando sus propias reglas personalizadas basadas en el tipo de publicación existente.

Básicamente, haremos esto:

  • Tome el conjunto de reglas existente y luego escriba el nuestro con nuestras propias babosas personalizadas
  • Otorgue a la nueva regla una prioridad más alta que la babosa del tipo de publicación personalizada

Así es como puedes hacer esto:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Ahora, tendrá dos formas de acceder a sus películas:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Tenga en cuenta que no recomiendo conectarlo add_custom_rewrite_rulea la initacción, ya que se disparará con demasiada frecuencia. Esto es solo un ejemplo. Un mejor lugar para aplicar la función sería la activación del tema, la activación del complemento, tal vez la acción save_post, etc. Dependiendo de lo que necesite hacer, es posible que solo necesite activarlo una o varias veces.

En este punto, es posible que desee considerar actualizar los enlaces permanentes para el tipo de publicación personalizada para usar el ' /movies/slug ' . Por ejemplo, si navega hacia /films/, verá una lista de todas sus películas, pero al pasar el cursor sobre el título, se revelará que la /movies/babosa todavía se está utilizando.

Para ir un paso más allá, técnicamente podría instalar una redirección 301 para atrapar todos los enlaces /movies/para redirigir a su /films/contraparte, pero todo esto depende de lo que intente hacer.

Tom
fuente
Funcionó muy bien! ¿Podría también señalarme en la dirección correcta para actualizar los enlaces permanentes?
Edbury
1
Dependiendo de su tema, puede hacerlo a nivel de plantilla. Cuando vea la llamada a 'the_title ()', puede reemplazarlo con $ title = get_the_title (), luego reemplace la cadena '/ movies /' en $ title con '/ films /'.
Tom
¿Qué sucede si la babosa a la que desea cambiar se crea dinámicamente por un metavalor de la publicación actual? Necesito poder usar $posten la add_custom_rewrite_rule()función, pero arroja errores en el Administrador de WP que dice 'Intentando obtener la propiedad de no objeto'. ¿Cómo puedo obtener $ post para obtener el metavalor?
Lee
6

Este código funcionó bien para el tema de mi hijo. Necesario para cambiar la babosa de "programa" a "lugar".

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
Iggy
fuente
Funciona perfectamente, también lo he usado para las etiquetas que agregan la regla relativa, es necesario actualizar los enlaces permanentes ejecutando un guardado desde la página de configuración> enlace permanente. ¡Gracias!
Lorenzo Magon
Funciona perfectamente para cambiar otros argumentos también, necesitaba configurar $args['has_archive'] = falsey esto funcionó.
Mera Desarrollo