3

我正在尝试使用专业版的 WP All Import 将数据从 Excel 工作表导入 WordPress。我们使用 Polylang 来支持多语言。我想知道如何管理将内容导入正确的语言版本。我发现有一个隐藏的分类“语言”,我可以手动将其设置为“de”以将语言设置为德语。但是如何链接相应的翻译?任何想法如何解决这个问题,也许有一些自定义功能?先感谢您!

4

2 回答 2

0

我找到了更好的解决方案。

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 中删除代码。刷新。嘘。

于 2021-08-12T12:54:06.787 回答
-1

请注意,我目前同时使用 Polylang 和 Wp All Import/Export Pro 版本。

此外,这目前不是“过时”的代码。它依赖于 wp all import 团队直接建议的未记录功能。我只是在说动作$data传递的附加参数pmxi_saved_post

也就是说,我知道 polylang 开发人员目前正在为这个特定问题开发一个插件。无论如何,我现在设法以这种方式做到了:

1 -> 导出数据时,有 2 个与 polylang 相关的字段:languagespost_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();

就这样。:) 啊,上面提到的附件:

在此处输入图像描述

于 2018-06-18T13:06:25.643 回答