Автоматическая синхронизация Polylang для постов

Я работаю над многоязычным веб-сайтом WordPress, используя плагин Polylang на страницах и настраиваемые типы сообщений.

То, что я ищу, - это способ автоматической синхронизации каждого сообщения без участия пользователя. При создании нового типа записи будет автоматически создан перевод и скопировано все содержимое.

Таким образом, пользователь вообще не увидит эту панель или, по крайней мере, не сможет отредактировать перевод или (особенно) отключить синхронизацию. Я предполагаю, что это можно сделать, изменив привилегии ролей пользователей, но сообщение определенно должно автоматически синхронизироваться.

Я проверил эту статью, но ничего не сделал.


person slotstartslotend    schedule 11.12.2019    source источник


Ответы (2)


Нужно было что-то подобное, откопал эту недокументированную функцию:

global $polylang;
// third parameter sets synchronisation
$polylang->sync_post_model->copy_post($post_id, $lang, true);

Это дублирует содержимое на выбранный язык и обеспечивает синхронизацию.

Пример использования save_post:

function auto_translate($post_id, $post, $update)
{
    if (!$update) {
        return;
    }

    // prevent recursion when publishing translations
    remove_action('save_post', 'auto_translate', 999, 3);

    global $polylang;
    $langs = ['nb', 'se', 'dk'];
    $current_translations = pll_get_post_translations($post_id);

    foreach ($langs as $lang) {
        if (!isset($current_translations[$lang])) {
            $polylang->sync_post_model->copy_post($post_id, $lang, true);
        }
    }
}

// needs low priority or the synchronisation option wont be saved
add_action('save_post', 'auto_translate', 999, 3);
person steinoy    schedule 07.05.2020

Решение, предложенное steinoy, хорошо, но создает дополнительный нежелательный черновой пост. Вот улучшенное решение:

function auto_translate($post_id, $post, $update)
{
    if (!$update) {
        return;
    }

    // prevent creation of additional duplicate draft posts
    if ( $post->post_status == 'draft' ){
        return;
    }

    // prevent recursion when publishing translations
    remove_action('save_post', 'auto_translate', 999, 3);

    global $polylang;
    $langs = ['nb', 'se', 'dk'];
    $current_translations = pll_get_post_translations($post_id);
    $post_type = get_post_type($post_id);
    
    if ($post_type == 'post') {
        foreach ($langs as $lang) {
            if (!isset($current_translations[$lang])) {
                $polylang->sync_post_model->copy_post($post_id, $lang, true);
            }
        }
    }
}

// needs low priority or the synchronisation option wont be saved
add_action('save_post', 'auto_translate', 999, 3);
person Chris L    schedule 13.10.2020