WP All Import Pro: совместимость с Polylang
Я пытаюсь импортировать данные из листа Excel в WordPress с Pro-версией WP All Import. Мы используем Polylang для поддержки нескольких языков. Интересно, как управлять импортом контента на правильные языковые версии. Я обнаружил, что существует скрытый таксономический "язык", который я могу вручную установить на "де" для установки языка на немецкий. Но как связать соответствующие переводы? Любые идеи, как решить эту проблему, может быть, с помощью некоторых пользовательских функций? Заранее спасибо!
2 ответа
Я нашел лучшее решение.
if ( !function_exists( 'pll_save_post_translations' ) ) {
require_once '/include/api.php'; }
$arr = array();
$result = pll_save_post_translations(['en' => 21398, 'ro'=>21396]);
// где 21398 и 21396 - это post_id, а en и ro - названия языков.
Поместите этот код в свой functions.php и запустите его только один раз (это означает, что вы обновляете страницу только один раз как администратор после того, как поместите его). Затем удалите код из functions.php. На самом деле он не создает ошибок, просто не рискуйте, не запускайте его дважды.
Прежде чем вы это сделаете, вы должны импортировать продукты на обоих (в моем случае) языках. Это означает, что вы импортируете их на одном языке (вы выбираете один язык в верхней панели администратора), а затем в другом сеансе вы импортируете их на другом языке (вы выбираете другой язык), а также если вы видите «Показать частные таксономии» в WP All import, поместите туда один код языка. По одному на каждую сессию. После того, как продукты на обоих языках были импортированы, вы запускаете приведенный выше код, чтобы сообщить WordPress, что «этот post_id является переводом того post_id». Я надеюсь, что это помогает. А, и вы получаете post_id в красивой таблице, которую вы можете редактировать в Excel, экспортируя продукты с помощью Wordpress Export (я думаю, он предустановлен при установке WordPress). Вы найдете его на панели инструментов в Инструменты / Экспорт.
И положите $ result = pll_save_post_translations(['en' => 56465, 'ro'=>654864]); столько раз, сколько вам нужно
$result = pll_save_post_translations(['ru' => 9999, 'ro'=>34654]);$result = pll_save_post_translations(['ru' => 98641, 'ro'=>98651]); .
для каждого соотношения. Вы можете сделать это проще в Excel, у вас есть коррелирующие идентификаторы в двух отдельных столбцах, а затем поместите эту формулу в следующую строку = concatenate ("$ result = pll_save_post_translations(['en' =>", CELL A1, "'ro'=>", ЯЧЕЙКА B1,"]);") Приложите вниз. Выберите столбец, который вы только что объединили. Вставьте его под кодом в functions.php. Сохранить. Обновить. Удалите код из functions.php. Обновить. Буйя.
Обратите внимание, что в настоящее время я использую версии Polylang и Wp All Import/Export Pro.
Кроме того, в настоящее время это не устаревший код. Он опирается на недокументированную функцию, которая была предложена непосредственно из команды wp all import. Я говорю просто о дополнительном параметре $data
прошел мимо pmxi_saved_post
действие.
Тем не менее, я знаю, что разработчики Polylang в настоящее время работают над дополнением для этой конкретной проблемы. Во всяком случае, мне удалось сделать это таким образом, а пока:
1 -> при экспорте данных есть 2 поля, связанных с многоязыком: languages
а также post_translations
, Экспортируйте их тоже.
2 -> когда вы импортируете свои данные, на экране wpallimport создайте еще 2 пользовательских поля и сохраните 2 выше. Смотрите приложение ниже. Теперь у вас есть данные переводов с каждого поста.
3 -> установить этот фильтр:
global $language_codes;
$language_codes = array( // sample lang data
'italiano' => 'it'
,'english' => 'en'
,'espanol' => 'es'
,'francais' => 'fr'
,'deutsch' => 'de'
);
add_action('pmxi_saved_post', 'set_imports_lang', 10, 2);
// using undocumented param $data
// action firm is the following (in fact, it passes 3 params): do_action( 'pmxi_saved_post', $pid, $rootNodes[$i], $is_update );
function set_imports_lang($post_id, $data){
global $language_codes;
// 'lingue' is italian, I guess it will be 'languages' in english: it's one of the 2 fields we saved before
pll_set_post_language($post_id, $language_codes[sanitize_title($data->lingue)]);
}
На данный момент вы только что установили исходный язык каждого сообщения, не более того. Теперь мы должны связать переводы друг с другом. Мы сделаем это с помощью функции, которую мы должны запустить ТОЛЬКО 1 РАЗ. Он будет просто перезагружать любой wp-экран / страницу.
function set_imports_translations(){
global $wpdb;
global $language_codes;
// substitute 'enews' with your own post type
$list = $wpdb->get_results("
SELECT
m.post_id, m.meta_value pll, group_concat(concat_ws(':', m2.meta_value, m.post_id)) ids
FROM
$wpdb->posts p
INNER JOIN $wpdb->postmeta m ON p.ID = m.post_id
INNER JOIN $wpdb->postmeta m2 ON m.post_id = m2.post_id AND m2.meta_key = '_import_language_name'
WHERE
p.post_type = 'enews' AND m.meta_key = '_import_translations_id'
GROUP BY pll
");
// query results are something like this:
// 10258 pll_57e92254c445f 10258:Italiano,10259:English,10260:Español,10261:Français,10262:Deutsch
// 10263 pll_57e922552b8c6 10263:Italiano,10264:English,10265:Español,10266:Deutsch
// 10267 pll_57e9225587124 10267:Italiano
// extract data from the third column string
foreach($list as $item){
$ids = explode(',',$item->ids);
$list = array();
foreach($ids as $id){
$data = explode(':',$id);
$list[$language_codes[sanitize_title($data[0])]] = intval($data[1]);
}
//set the translations
pll_save_post_translations($list);
}
}
set_imports_translations();
Это все.:) Ах, вложение упомянуто выше: