我正在尝试使用专业版的 WP All Import 将数据从 Excel 工作表导入 WordPress。我们使用 Polylang 来支持多语言。我想知道如何管理将内容导入正确的语言版本。我发现有一个隐藏的分类“语言”,我可以手动将其设置为“de”以将语言设置为德语。但是如何链接相应的翻译?任何想法如何解决这个问题,也许有一些自定义功能?先感谢您!
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 中看到“显示私人分类法”导入,将一种语言代码放在那里。每个会话一个。两种语言的产品都导入后,运行上面的代码告诉 WordPress “this post_id is the translation of that post_id”。我希望它有所帮助。啊,你在一个漂亮的表格中获得了 post_id,你可以通过使用 Wordpress Export 导出产品在 Excel 中进行编辑(我认为它是在安装 WordPress 时预先安装的)。您可以在工具/导出的仪表板中找到它。
然后把 $result = pll_save_post_translations(['en' => 56465, 'ro'=>654864]); 你需要多少次
$result = pll_save_post_translations(['en' => 9999, 'ro'=>34654]); $result = pll_save_post_translations(['en' => 98641, 'ro'=>98651]); .
对于每个相关性。您可以在 Excel 中更轻松地做到这一点,您在两个单独的列上有相关的 id,然后将此公式放在下一行 =concatenate("$result = pll_save_post_translations(['en' =>",CELL A1," 'ro'= >",CELL B1,"]);") 向下应用。选择您刚刚连接的列。将其粘贴到functions.php 中的代码下。节省。刷新。从functions.php 中删除代码。刷新。嘘。
请注意,我目前同时使用 Polylang 和 Wp All Import/Export Pro 版本。
此外,这目前不是“过时”的代码。它依赖于 wp all import 团队直接建议的未记录功能。我只是在说动作$data
传递的附加参数pmxi_saved_post
。
也就是说,我知道 polylang 开发人员目前正在为这个特定问题开发一个插件。无论如何,我现在设法以这种方式做到了:
1 -> 导出数据时,有 2 个与 polylang 相关的字段: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();
就这样。:) 啊,上面提到的附件: