tag name wordpress url-rewriting permalinks

get tag name wordpress



Wordpress: incluye variable de lenguaje en url (4)

He estado desarrollando un complemento de idioma para WordPress que funciona completamente. Lo único que falta ahora es la reescritura de URL. He estado buscando en muchos sitios web, fuentes y otras preguntas sobre stackoverflow, pero parece que no puedo hacer funcionar mis enlaces permanentes.

Pude agregar una variable de cadena de consulta así:

public function append_query_string($url) { $args = array(''lang'' => $this->get_locale()); return add_query_arg($args, $url); } add_filter(''page_link'', array($this, ''append_query_string'')); add_filter(''post_link'', array($this, ''append_query_string'')); add_filter(''the_permalink'', array($this, ''append_query_string''));

Esto cambia mis enlaces a http://www.mylink.com?lang=en_us por ejemplo. Lo que quiero ahora es agregar una permastruct para que el usuario pueda tener las URL bonitas (por ejemplo, http://www.mylink.com/en/ )

He agregado el siguiente fragmento de código:

public function add_query_var($vars) { $vars[''lang''] = $this->get_locale(); return $vars; } add_filter(''request'' , array($this, ''add_query_var''), 10, 2 ); public function custom_permastruct() { add_permastruct(''language'', ''%lang%'', false); } add_action(''wp_loaded'', array($this, ''custom_permastruct''));

Lo único que necesito ahora es una regla de reescritura, supongo, pero podría estar totalmente equivocado. ¿Alguien que sabe cuál es la mejor solución para agregar esta permastra?

EDITAR He intentado que esto funcione durante un mes y no parezco capaz de captar los enlaces permanentes, ni siquiera con todas las respuestas anteriores y mi propia investigación. Así que es por eso que estoy golpeando esta publicación con una recompensa una vez más. Lo que necesito: tengo una función (get_locale) que devuelve un código de idioma. Este código de idioma debe implementarse en mi URL de la siguiente manera: "http://www.mywebsite.com/LANGUAGE_HERE/..."

Sé que necesito registrar mi propia estructura permanente para eso, pero ahí es donde todo sale mal. ¿Qué filtros necesito y qué debo poner en mis funciones de filtro? Cualquier ayuda es muy apreciada, porque estoy bastante desesperado aquí.

EDIT 2

Así que agregué reglas de reescritura, pero tampoco parecen funcionar. Me estoy poniendo un poco desesperado aquí. De todos modos, este es el código para las reglas de reescritura:

public function add_rewrite_rules() { $languages = $this->get_all_languages(); foreach($languages as $language) { add_rewrite_rule(''^'' . $language->code . ''/([^/]*)/?$'', ''index.php?lang=$matches[1]'', ''top''); } } add_action(''init'', array($this, ''add_rewrite_rules''));


Pruebe el siguiente código

function custom_rewrite_rules(){ global $langs; //Array containing locale => pretty permalink key value pair /* $langs = array ( ''en_us'' => ''en'', ) */ foreach($langs as $locale => $lang) { add_rewrite_rule( ''^''.$lang.''///(.*)/?$'', ''index.php?lang=''.$locale, ''top'' ); } } add_action( ''init'', ''custom_rewrite_rules'' );


También he tenido problemas con las estructuras de enlace permanente. A veces, al hacer clic en el enlace permanente que desea, y guardar de nuevo resuelve el problema. Como WordPress reescribe el htaccess al guardar.


Una configuración adecuada de Wordpress 2.0+ redireccionará todas las solicitudes a /index.php, por lo que no necesitará ninguna actualización de htaccess, y su perma-struct registrada se ve bien. Creo que todo lo que queda es configurar WordPress para usar tu %lang struct usando una estructura personalizada y deberías ser bueno para ir


Bien, bien, aquí hay un bloque de código que logra lo que estás pidiendo.

public function init(){ $permalink_structure = get_option( ''permalink_structure'' ); if( $permalink_structure != '''' ){ global $wp_rewrite; $lang = ''/'' . get_locale(); if ( ! got_url_rewrite() ) $prefix = ''/index.php''; if ( is_multisite() && !is_subdomain_install() && is_main_site() ) $blog_prefix = ''/blog''; if ( ! empty( $permalink_structure ) ) { $permalink_structure = preg_replace( ''#/+#'', ''/'', ''/'' . str_replace( ''#'', '''', $permalink_structure ) ); if ( $prefix && $blog_prefix ) $permalink_structure = $prefix . preg_replace( ''#^/?index/.php#'', '''', $permalink_structure ); else $permalink_structure = $blog_prefix . $permalink_structure; } if( substr( $permalink_structure, 0, strlen($lang) ) !== $lang ){ $permalink_structure = $lang . $permalink_structure; } $wp_rewrite->set_permalink_structure( $permalink_structure ); } }

Notas:

1) Asegúrese de estar utilizando la función init (puede dar a la función cualquier nombre) dentro del gancho de init .

2) En la carpeta wp-admin busque options-permalink.php . A partir de la línea 75 , verá algunos códigos interesantes que forman la base de esta respuesta.

3) es posible que también desee leer este artículo sobre el códice

El código anterior no requiere que el usuario seleccione manualmente una estructura de enlace permanente. Cualquier estructura de enlace permanente utilizada se antepondrá a la locale .