Localización temática de "babosas" (tipos de publicaciones personalizadas, taxonomías)

17

en mi tema quiero definir una serie de tipos de publicaciones personalizadas y taxonomías personalizadas, cada una con su propia babosa personalizada; el idioma base de mi tema es el inglés, por lo tanto, las babosas estarán en inglés

por ejemplo, al definir el slug de mensajes personalizados tipo "producto" args:

'rewrite' => array( 'slug' => 'product' ),

¿Hay alguna manera de traducir el "slug" a través de archivos po / mo? puedo ponerlo como:

'rewrite' => array( 'slug' => __('product', 'mytextdomain') )

o no va a funcionar? ¿Cuál es la práctica actual para localizar babosas?

unfulvio
fuente
No sé si estamos lidiando con el mismo problema, pero parece que sí. Para ilustrarlo mejor aquí, hay un enlace a una página de índice original para un tipo de publicación personalizado llamado prensacon un slug establecido en prensa. Usando WPML, la babosa de la página traducida es presscomo no puede ser de prensanuevo: / es / press / que no muestra nada (tenga en cuenta que ahora al hacer clic en el enlace ES no lo regresa a / prensa /). PERO, si visitas / es / prensa / funciona ...
Naoise Golden
Decidí redirigir las páginas de / en / press a / en / prensa para que el enlace probablemente ya no funcione como se mencionó. Lástima que no pude usar la babosa localizada, pero trabajar a tiempo es mejor que amigable con la localización de URL
Naoise Golden
Mira mi respuesta Naoise, creo que te dará una solución de trabajo.
chrisguitarguy
Tuve este problema por horas. Finalmente encontré un truco: github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/… Saludos.
Sylvain Tch

Respuestas:

19

No trataría de localizar tus babosas. En cambio, ¿por qué no dar a sus usuarios la opción de cambiarlos agregando otro campo a la página de configuración de enlace permanente?

Conéctate load-options-permalink.phpy configura algunas cosas para capturar los $_POSTdatos y guardar tu babosa. Agregue también un campo de configuración a la página.

<?php
add_action( 'load-options-permalink.php', 'wpse30021_load_permalinks' );
function wpse30021_load_permalinks()
{
    if( isset( $_POST['wpse30021_cpt_base'] ) )
    {
        update_option( 'wpse30021_cpt_base', sanitize_title_with_dashes( $_POST['wpse30021_cpt_base'] ) );
    }

    // Add a settings field to the permalink page
    add_settings_field( 'wpse30021_cpt_base', __( 'CPT Base' ), 'wpse30021_field_callback', 'permalink', 'optional' );
}

Luego, la función de devolución de llamada para el campo de configuración:

<?php
function wpse30021_field_callback()
{
    $value = get_option( 'wpse30021_cpt_base' );    
    echo '<input type="text" value="' . esc_attr( $value ) . '" name="wpse30021_cpt_base" id="wpse30021_cpt_base" class="regular-text" />';
}

Luego, cuando registres tu tipo de publicación, toma la babosa con get_option. Si no está allí, use su valor predeterminado.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    if( ! $slug ) $slug = 'your-default-slug';

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

Aquí está la parte del campo de configuración como complemento https://gist.github.com/1275867

EDITAR: otra opción

También puede cambiar la babosa en función de lo que se define en la WPLANGconstante.

Simplemente escriba una función rápida que contenga datos ...

<?php
function wpse30021_get_slug()
{
    // return a default slug
    if( ! defined( 'WPLANG' ) || ! WPLANG || 'en_US' == WPLANG ) return 'press';

    // array of slug data
    $slugs = array( 
        'fr_FR' => 'presse',
        'es_ES' => 'prensa'
        // etc.
    );

    return $slugs[WPLANG];
}

Luego obtenga la babosa donde registra su tipo de publicación personalizada.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

La mejor opción, IMO, sería darle al usuario una opción y proporcionar valores predeterminados sólidos:

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    // They didn't set up an option, get the default
    if( ! $slug ) $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}
chrisguitarguy
fuente
2
+1 para el complemento en gist y el código bien documentado. En mi caso, sin embargo, no cumple con el propósito, que es no dar poder al usuario, sino hacer urls conscientes de localización (amigables con SEO) para tipos de publicaciones personalizadas
Naoise Golden
1
No estoy seguro de entender por qué querrías eliminar una opción de tu usuario. Además, ejecutar una babosa a través de un filtro de traducción les da la misma opción: cambiar la babosa. Simplemente no con un bonito campo de formulario para completar.
chrisguitarguy
1
solo por curiosidad, ¿por qué wpse30021?
Naoise Golden
Parece que esta opción es para una localización basada en WPLANG. Pero, ¿qué pasa si está trabajando con un sitio multilingüe? (por ejemplo, el complemento WPML). La pregunta es más acerca de mostrar un slug diferente dependiendo de la localización del cliente que de poder establecer un slug de tipo de publicación personalizada desde las opciones del servidor.
Naoise Golden
wpse = intercambio de pila de WordPress. 30021 es el número de la URL. Buena suerte con tu búsqueda; He dado mi respuesta. La complejidad adicional que está agregando y el aparente cambio completo de la pregunta original, originalmente sobre las babosas CPT, solo justifica que el usuario final pueda elegir su propia babosa.
chrisguitarguy
2

Si eso no funciona ¿Por qué no simplemente lo haces?

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
chifliiiii
fuente
esto no funcionó para mí
Naoise Golden
es básicamente el mismo código en otro estilo
Naoise Golden
¿Has añadido el dominio de texto adecuado? <? php load_theme_textdomain (my_text_domain);?>?
chifliiiii
Esta es, de lejos, la mejor solución.
Al Rosado
2

Estoy haciendo exactamente eso en un tema que estamos desarrollando. Está disponible en 5 idiomas distintos, y cada idioma tiene un conjunto traducido de categorías. El primer componente de la URL en el tema se analiza para determinar qué idioma se utiliza, en formato de idioma del país:

/uk-en
/fr-fr
/it-it

Y luego las categorías traducidas se analizan como componentes adicionales de la URL.

La URL se analiza en la parse_requestfase:

function my_parse_request( $wp ) {
    $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $components = preg_split('|/|', $path, null, PREG_SPLIT_NO_EMPTY );

    // Determine language from $components[0]
    $language = array_shift( $components );
    ...

    // Load translations file...
    $mofile = get_stylesheet_directory()."/$language.mo";

    load_textdomain( 'mydomain', $mofile );

    ...

    // Determine category from $components[0]
    if( __( 'some-category', 'mydomain' ) == $components[0] )
      $wp->query_vars['category'] = 'some-category';

    ...
}
add_action( 'parse_request', 'my_parse_request' );

Este ejemplo carece de las verificaciones necesarias, pero solo se entiende como un ejemplo.

Hay inconvenientes en este enfoque, por supuesto, pero permite URL naturales en todos los idiomas. Los principales inconvenientes que veo son:

1) No utiliza el mecanismo de enlace permanente. Es probable que esto se extienda para que se generen las reglas de enlace permanente adecuadas para todos los idiomas y parse_request no sea necesario, pero hacerlo para todos los idiomas implicaría cargar un archivo MO después de otro en un bucle, y no saber qué tan bien apoyado está eso.

2) Si un traductor cambia una babosa, los enlaces se invalidan.

Bendoh
fuente
0

Podrías probar esto en tu functions.php

<?php
add_filter('rewrite_slugs', function($translated_slugs) {
    // the possible translations for your slug 'product'
    $translated_slugs = array(
        'product' => array(
            'pt' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'produto'),
            ),
            'es' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'producto'),
            ),
        ),
    );
    return $translated_slugs;
});
?>

como se ve aquí

Junior M
fuente
-1

Yo recomendaría no hacer que las babosas sean traducibles .

La traducción es para el contenido del sitio orientado al usuario . Las babosas se usan internamente y solo son marginalmente "públicas" a través de reescrituras de URL y URL tampoco deben ser traducibles .

Entonces: deja tus babosas en paz, como las definiste. Solo haga cadenas traducibles que estén destinadas al consumo público .

Chip Bennett
fuente
11
Las babosas traducidas, tanto desde el punto de vista del SEO como de la experiencia del usuario, tienen mucho sentido ...
Naoise Golden
No estoy de acuerdo con que las babosas afecten la experiencia del usuario de ninguna manera. Si se usa una babosa como parte de un enlace, el texto de enlace del enlace se traducirá, por lo que el usuario no sabrá la diferencia. Y cuando la gente comienza a lanzar "SEO", generalmente pienso, " aceite de serpiente ". No soy un experto en SEO, pero no estoy comprando el impacto de SEO con respecto a las babosas traducidas.
Chip Bennett
3
No estoy de acuerdo por experiencia. Tenemos gerentes de contenido extranjeros internos que son explícitos de que los slugs de URL deben ser localizados. Se trata de crear una experiencia local completa para el usuario extranjero. Para algunos países, como Japón, es literalmente esencial establecer un tipo auténtico de confianza e indicar que realmente tomas en serio hacer negocios allí.
internetross
las URL deben hablar. Entonces, si la babosa es (tan a menudo) el nombre de la entidad o la taxonomía, la reescritura debe tener en cuenta tanto los plurales como las traducciones. Esa no es una opción, tanto para SEO como simplemente una buena práctica para los usuarios finales.
Luca Reghellin