Redeclarar/Cambiar el Slug de un Tipo de Entrada Personalizada de un Plugin

11 feb 2012, 18:03:50
Vistas: 69.5K
Votos: 32

¿Es posible redeclarar/cambiar el slug de un tipo de entrada personalizada existente de un plugin (sin editar directamente el plugin)?

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

1
Comentarios

Acabo de resolver este mismo problema enganchándome al hook 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 problemas en el futuro?

Dustin Dustin
12 abr 2013 05:48:23
Todas las respuestas a la pregunta 4
4
32

Sí, esto es posible, pero si el plugin está creando un tipo de entrada personalizado usando el parámetro rewrite => array('slug' => 'post_type'), entonces no es probable que puedas reemplazar el slug.

Cuando se crean tipos de entradas personalizados, las reglas de reescritura de URL se escriben en la base de datos. Dependiendo de qué acción activa la creación del tipo de entrada personalizado (como la acción init), WordPress restablecerá las reglas de reescritura y restaurará los slugs del tipo de entrada personalizado, sin importar los cambios que intentes hacer.

Dicho esto, puedes proporcionar slugs personalizados para los tipos de entradas personalizados. El siguiente ejemplo asume que tienes un tipo de entrada personalizado llamado movies y que estás intentando cambiar el slug /movies/ a /films/.

Para ser completo, aquí está la función básica utilizada para definir el tipo de entrada personalizado movies. El plugin al que te refieres debería estar haciendo algo como esto:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Películas'),
                'singular_name' => __('Película')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

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

Puedes modificar la tabla de opciones proporcionando tus propias reglas personalizadas basadas en el tipo de entrada existente.

Básicamente, haremos esto:

  • Tomar el conjunto de reglas existentes y luego escribir nuestras propias reglas con nuestros slugs personalizados
  • Dar a la nueva regla una prioridad más alta que el slug del tipo de entrada personalizado

Aquí está cómo puedes hacerlo:

function add_custom_rewrite_rule() {

    // Primero, intentamos cargar las reglas de reescritura. Hacemos esto por si acaso
    // se está utilizando la estructura de enlaces permanentes por defecto.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Luego, iteramos a través de cada regla personalizada añadiendo una nueva regla
        // que reemplace 'movies' con 'films' y le damos una mayor
        // prioridad que la regla existente.
        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

    // ...y restablecemos las reglas
    flush_rewrite_rules();

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

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

  • /movies/Volver-Al-Futuro
  • /films/Volver-Al-Futuro

Nota que no recomiendo enganchar add_custom_rewrite_rule a la acción init ya que se ejecutará con demasiada frecuencia. Esto es solo un ejemplo. Un mejor lugar para aplicar la función sería en la activación del tema, activación del plugin, quizás la acción save_post, etc. Dependiendo de lo que necesites hacer, puede que solo necesites ejecutarla una vez o unas pocas veces.

En este punto, quizás quieras considerar actualizar los enlaces permanentes para el tipo de entrada personalizado para usar el slug '/movies/. Por ejemplo, si navegas a /films/, verás un listado de todas tus películas pero al pasar el cursor sobre el título revelará que todavía se está usando el slug /movies/.

Para ir un paso más allá, podrías técnicamente instaurar un redireccionamiento 301 para captar todos los enlaces a /movies/ y redirigirlos a su contraparte /films/, pero todo depende de lo que estés intentando hacer.

13 feb 2012 16:40:49
Comentarios

¡Funcionó perfectamente! ¿Podrías también indicarme la dirección correcta para actualizar los enlaces permanentes?

Edbury Edbury
13 feb 2012 22:23:38

Dependiendo de tu tema, puedes hacer esto a nivel de plantilla. Cuando veas la llamada a 'the_title()', puedes reemplazarla con $title = get_the_title(), luego reemplazar en la cadena '/movies/' en $title con '/films/'.

Tom Tom
14 feb 2012 15:16:06

¿Qué pasa si el slug al que quieres cambiar se crea dinámicamente por un valor meta de la publicación actual? Necesito poder usar $post en la función add_custom_rewrite_rule() pero está generando errores en el administrador de WP diciendo 'Trying to get property of non-object'. ¿Cómo puedo obtener $post para conseguir el valor meta?

Lee Lee
17 ene 2018 18:15:37

¡Esto funcionó increíblemente bien! Gracias por compartirlo.

Student22 Student22
22 feb 2024 10:22:14
3
15

Este código funcionó bien para mi tema hijo. Necesitaba cambiar el slug "program" por "place".

/*
CAMBIAR SLUGS DE TIPOS DE ENTRADAS PERSONALIZADAS
*/

function change_post_types_slug( $args, $post_type ) {

   /*slug para el tipo de entrada*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

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

/*
CAMBIAR SLUGS DE TAXONOMÍAS, slugs usados para páginas de archivo
*/

function change_taxonomies_slug( $args, $taxonomy ) {

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

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
23 dic 2017 22:29:38
Comentarios

Funciona perfectamente, también lo he usado para las etiquetas añadiendo la regla correspondiente, es necesario actualizar los enlaces permanentes ejecutando un guardado desde la página de ajustes > enlaces permanentes. ¡Gracias!

Lorenzo Magon Lorenzo Magon
19 oct 2018 21:17:46

Funciona perfectamente para cambiar otros argumentos también, necesitaba configurar $args['has_archive'] = false y esto funcionó.

Mere Development Mere Development
8 feb 2019 18:35:48

¿Qué pasa si quisiera cambiar el enlace permanente de la entrada en lugar del slug del CPT, como: themename/projects/slug-de-la-entrada ??

Krys Krys
15 oct 2020 12:05:18
0

En mi caso, había un plugin (necesario para que el tema funcione) que registraba un tipo de entrada personalizado y quería cambiar algunas cosas, como el slug entre otros.

Así que lo que hice fue volver a registrar (una especie de sobrescritura de la función de registro del plugin) el tipo de entrada personalizado agregando lo siguiente en el archivo functions.php de mi tema hijo de la siguiente manera:

function my-theme-name_post_type_my-custom-post-type-name()
{
   $labels = array(
      ...
   );

   $args = array(
      ...

      'rewrite' => array(
         'slug' => __('el-slug-de-tu-eleccion', 'el-dominio-de-texto-de-tu-eleccion-para-traduccion-si-es-necesario'),
      ),
   );
   register_post_type('el-nombre-del-tipo-de-entrada-personalizado-registrado-por-el-plugin', $args);
}
add_action('init', 'my-theme-name_post_type_my-custom-post-type-name');

Como puedes ver, puedes cambiar el slug simplemente agregando lo siguiente al array $args:

'rewrite' => array(
    'slug' => __('el-slug-de-tu-eleccion', 'el-dominio-de-texto-de-tu-eleccion-para-traduccion-si-es-necesario'),
)

Más información sobre esto en: https://developer.wordpress.org/reference/functions/register_post_type/

MUY IMPORTANTE

Recuerda actualizar tus enlaces permanentes para que los cambios se apliquen y así puedas acceder a las entradas involucradas. Ve a la configuración de enlaces permanentes y simplemente presiona "Guardar".. ¡entonces debería funcionar!

14 feb 2021 17:28:23
0
function change_portfolio_slug() {
    $args = get_post_type_object( 'portfolio' );
    if ( ! empty( $args ) ) {
        $args->rewrite['slug'] = 'project';
        register_post_type( 'portfolio', $args );
    }
}
add_action( 'init', 'change_portfolio_slug', 20 );

En mi caso, el plugin declara un tipo de contenido personalizado "portfolio" con 'rewrite' => array( 'slug' => 'portfolio'), usando un hook en la acción 'init' add_action( 'init', 'some_plugin_custom_posts_init' );.

El fragmento anterior, colocado en el archivo functions.php del tema, define una nueva función change_portfolio_slug() que modifica el argumento rewrite para el tipo de entrada portfolio, cambiando su slug a "project". Luego usamos la función register_post_type() para registrar el tipo de entrada con los argumentos modificados.

La función add_action() engancha la función change_portfolio_slug() a la acción init, para que se ejecute cuando WordPress se inicializa.

En la última línea del fragmento add_action( 'init', 'change_portfolio_slug', 10 );, el número 10 es la prioridad del hook de acción. Si deseas cambiar la prioridad, podrías cambiar el 10 por un número diferente. En mi caso, la prioridad que funcionó fue 20.

Nota que puede que necesites refrescar tus enlaces permanentes después de hacer este cambio para asegurar que la nueva estructura de URLs se aplique correctamente. Puedes hacer esto yendo a Ajustes > Enlaces permanentes en tu panel de administración de WordPress y haciendo clic en el botón "Guardar cambios".

10 mar 2023 17:04:18