Как я могу перезаписать код функции плагина WP (WPML)?

Мне нужна помощь, пожалуйста, перезапишите функцию WPML, которая выводит тег rel-alternate-hreflang. В идеале вы должны предоставить мне функцию, которую я могу поместить в файл function.php моей дочерней темы.

Я использую популярный плагин WPML (WordPress Multi Language) для управления несколькими языками на сайте WP Multi. У меня есть один сайт (канадский) на английском и французском языках, а другой сайт (США) на английском и испанском языках. Я хочу рассказать Google о другом сайте в отношении реализации тега rel-alternate-hreflang. Это должно помочь Google направлять канадцев на эквивалентную страницу в Канаде и наоборот для посетителей из США. В настоящее время плагин WPML (который управляет ОБОИМ сайтом в мультисайте) выводит ...

На сайте США....

<link rel="alternate" hreflang="en-US" href="http://siteaddress.com/pagename" />
<link rel="alternate" hreflang="es" href="http://siteaddress.com/es/spanishpagename" />

На канадском сайте....

<link rel="alternate" hreflang="en-CA" href="http://siteaddress.com/ca/pagename" />
<link rel="alternate" hreflang="fr" href="http://siteaddress.com/es/spanishpagename" />

НО Я ХОЧУ, ЧТОБЫ ЭТО ВЫВОДИЛОСЬ...
(обратите внимание, что названия английских страниц идентичны, единственное отличие состоит в /ca/. Я ничего не могу поделать с сайтом в США, зная название французской страницы или канадский сайт, знающий название страницы на испанском языке. Эта информация не будет доступна в каждой многосайтовой базе данных. Однако URL-адреса имен страниц в Канаде и США — это простой расчет после извлечения ссылки href)

На сайте США....

<link rel="alternate" hreflang="en-US" href="http://siteaddress.com/pagename" />
<link rel="alternate" hreflang="es" href="http://siteaddress.com/es/spanishpagename" />
<link rel="alternate" hreflang="en-CA" href="http://siteaddress.com/ca/pagename" />

На канадском сайте....

<link rel="alternate" hreflang="en-CA" href="http://siteaddress.com/ca/pagename" />
<link rel="alternate" hreflang="fr" href="http://siteaddress.com/es/spanishpagename" />
<link rel="alternate" hreflang="en-US" href="http://siteaddress.com/pagename" />

Я пытался обратиться за технической поддержкой в ​​WPML, но не получил той помощи, на которую надеялся. Поэтому я нашел функцию, которая создает этот вывод в файле «wp-content/plugins/sitepress-multilingual-cms/sitepress.class.php». Я не хочу взламывать этот файл, так как плагин регулярно обновляется. Так что, надеюсь, мы сможем переопределить его, если это возможно. Обратите внимание, что этот же сценарий выводит ОБА вывод для США и Канады, поэтому нам также нужно сначала выяснить, какой вывод он создает, прежде чем мы сможем рассчитать эквивалентную страницу CAN и США.

Код функции выглядит так...

function head_langs()
{
    $languages = $this->get_ls_languages( array( 'skip_missing' => true ) );
    // If there are translations and is not paged content...

    //Renders head alternate links only on certain conditions
    $the_post = get_post();
    $the_id   = $the_post ? $the_post->ID : false;
    $is_valid = count( $languages ) > 1 && !is_paged() && ( ( ( is_single() || is_page() ) && $the_id && get_post_status( $the_id ) == 'publish' ) || ( is_home() || is_front_page() || is_archive() ) ); 

    if ( $is_valid ) {
        foreach ( $languages as $code => $lang ) {
            $alternate_hreflang = apply_filters( 'wpml_alternate_hreflang', $lang[ 'url' ], $code );
            printf( '<link rel="alternate" hreflang="%s" href="%s" />' . PHP_EOL,
                    $this->get_language_tag( $code ),
                    str_replace( '&amp;', '&', $alternate_hreflang ) );
        }
    }
}

Можно ли это сделать? В качестве альтернативы мне было интересно, есть ли способ найти эти теги с помощью jQuery, получить ссылку на страницу, добавить "/ca" или удалить ее и вставить дополнительный тег с помощью соответствующий hreflang. Но я подозреваю, что это вопрос для другого поста. Я думаю, что приведенное выше решение, которое я ищу, было бы лучшим способом.

Спасибо за твою помощь!


person KingRobb    schedule 29.02.2016    source источник


Ответы (1)


Вы можете удалить выполнение этой функции:

remove_action('wp_head', array("SitePress","head_langs"))

а затем зарегистрируйте свою собственную функцию

add_action("wp_head","my_own_head_langs_fn");
function my_own_head_langs_fn() {
// paste here your modified version of head_langs
}
person kkarpieszuk    schedule 03.03.2016
comment
Спасибо за ваш ответ. Ваша идея верна, но на самом деле не работает, так как я думаю, что там есть переменные, которые зависят от другого кода в файле wp-content/plugins/sitepress-multilingual-cms/sitepress.class.php. Я получил сообщение об ошибке... Неустранимая ошибка: использование $this, когда оно не находится в контексте объекта в mypath/functions.php в строке XXX - person KingRobb; 10.03.2016
comment
да, вы должны полностью переписать свой код. не использовать переменные вне его области видимости. Если вы хотите немного изменить функцию, начните свой функциональный блок с global $sitepress; $this = $sitepress;. Может работать, но я никогда не проверял - person kkarpieszuk; 11.03.2016
comment
Хорошо, спасибо за ваше предложение @kkarpieszuk - К сожалению, оно не сработало. Я получил следующее... Неустранимая ошибка: невозможно переназначить $this... - person KingRobb; 16.03.2016