Hi Chouby,
Let's move the Theme My Login business over here:
As I mentioned in my previous post, this is what I did to fix the user links.
function p4tml_my_login_domain() {
global $l10n;
$locale = get_locale();
$mofile = WP_PLUGIN_DIR . '/theme-my-login/language/' . 'theme-my-login-' . $locale . '.mo';
if( file_exists( $mofile ) )
load_textdomain( 'default', $mofile );
}
add_action( 'plugins_loaded', 'p4tml_my_login_domain', 9 ); //User links titles are read with a priority of 10 when plugins_loaded actions are applied.
function p4tml_user_links( $user_links ) {
foreach( $user_links as $key => $user_link ) {
$user_links[$key]['title'] = __( $user_link['title'] );
}
return $user_links;
}
add_filter( 'tml_user_links', 'p4tml_user_links', 11 ); //Fixes user links titles translations before they're picked up by the theme.
function p4tml_title( $title ) {
return __( $title );
}
add_filter( 'tml_title', 'p4tml_title', 11 ); //Fixes TML titles translations before they're picked up by the theme.
And this adds the page's action meta needed in order for TML to recognize a translated page as its own:
function p4tml_action_meta( $page_link, $post_id ) {
if( ! $page = get_post( $post_id ) )
return $page_link;
if( 'page' != $page->post_type )
return $page_link;
$original = pll_get_post( $page->ID, pll_default_language() );
if( $original == $page->ID )
return $page_link;
$tml_action = get_post_meta( $original, '_tml_action', true );
if( ! empty( $tml_action ) ) {
$check = get_post_meta( $page->ID, '_tml_action', true );
if( $tml_action != $check )
update_post_meta( $page->ID, '_tml_action', $tml_action );
}
return $page_link;
}
add_filter( 'page_link', 'p4tml_action_meta', 9, 2 );
Now the translated Register, Lost Password, etc. pages can be recognized by TML.
If a user wants to log out, the log-out page permalink requires a nonce query string:
http://www.mysite.com/en/logout/?_wpnonce=8c9565c961
This nonce query string is lost in polylang/frontend/frontend-links.php (near line 99)
public function page_link($link, $id) { //$link contains the nonce query string.
if ($this->page_on_front && ($lang = $this->model->get_post_language($id)) && $id == $this->model->get_post($this->page_on_front, $lang))
return $lang->home_url;
return _get_page_link($id); //The nonce query string is not part of the id.
}
So, you get a pretty WordPress Failure Notice page, instead of a regular log out, which would return you to your current language home page, waiting for you to enter your username and password.
This is what I did to fix it:
public function page_link($link, $id) {
$query_string = '';
if( strpos( $link, '?' ) !== FALSE ) //Check if the link includes a query string.
$query_string = substr( $link, strpos( $link, '?' ), strlen( $link ) - strpos( $link, '?' ) ); //If it does, grab it!
if ($this->page_on_front && ($lang = $this->model->get_post_language($id)) && $id == $this->model->get_post($this->page_on_front, $lang))
return $lang->home_url . $query_string; //Append it.
return _get_page_link($id) . $query_string; //Append it.
}
This fixes the Theme My Login logout error and the WP e-Commerce's customer account tabs selection I mentioned in my previous post.
After this, I convert the url from the default language to the current language:
function p4we_translate_post_url($url, $leavename = false, $sample = false, $action = '' ) { //$action is set by TML
global $wp_rewrite;
if ( '' != $url && ( p4we_language_conditions_are_met() || ! empty( $action ) ) ) {
$query_string = '';
if( strpos( $url, '?' ) !== FALSE ) {
$query_string = substr( $url, strpos( $url, '?' ), strlen( $url ) - strpos( $url, '?' ) );
$url = str_replace( $query_string, "", $url );
}
$translated_page = p4we_translated_post_from_name ( basename ( $url ) ); //Query the cache/db using the page_name, use pll_get_post to get current language post and with this post id, get the post.
if (in_array ( $translated_page->post_type, array (
'page',
'wpsc-product'
) )) {
$draft_or_pending = in_array ( $translated_page->post_status, array (
'draft',
'pending',
'auto-draft'
) );
$url = $wp_rewrite->get_page_permastruct ();
if ( ! empty ( $url ) && ( ( isset( $translated_page->post_status ) && ! $draft_or_pending) || $sample)) {
if (! $leavename)
$url = str_replace ( '%pagename%', get_page_uri( $translated_page ), $url );
if ( pll_current_language() )
$url = home_url( pll_current_language () . '/' . $url );
elseif (isset ( $_COOKIE ['pll_language'] ))
$url = home_url ( $_COOKIE ['pll_language'] . '/' . $url );
else
$url = home_url ( $url );
$url = user_trailingslashit ( $url, 'page' );
if( ! empty( $query_string ) )
$url .= $query_string;
} else
$url = home_url ( '?page_id=' . $translated_page->ID );
}
}
return $url;
}
TODO: There's still a minor outstanding issue. If you add a page not originally included by Theme My Login to be shown to a user, you only get to enter its permalink in one language.
A filter hook needs to be used in order to modify its permalink depending on the language.
Well, I hope you approve this minor Polylang modification.
If you require any additional information, please don't hesitate to ask.