带有 SEO 插件的 OctoberCMS 翻译插件不会翻译 CMS 页面和博客的 SEO 关键字

Posted

技术标签:

【中文标题】带有 SEO 插件的 OctoberCMS 翻译插件不会翻译 CMS 页面和博客的 SEO 关键字【英文标题】:OctoberCMS translate plugin with SEO plugin doesnt translate SEO keywords for CMS pages and Blogs 【发布时间】:2020-12-26 11:08:38 【问题描述】:

我正在使用 OctoberCMS SEO 翻译插件 https://octobercms.com/plugin/anandpatel-seoextension,它可以按照我的预期工作.. 但我对 Translate 插件 https://octobercms.com/plugin/rainlab-translate 有疑问。请先看我的几张截图。

正如您在我上面的 2 个屏幕截图中看到的,在我应该创建或编辑博客的博客页面中,我无法翻译元标题、元描述、元关键字等。

此外,在我的 CMS 页面中,我也无法使我的“元关键字”可翻译..

我已尝试将以下代码放入我的一个活动插件的Plugin.php 文件中,以便能够使我的博客“元标题”字段可翻译,但它也不起作用..

\RainLab\Blog\Models\Post::extend(function($model)             
            $model->translatable[] = 'seo_title';
        );

并尝试了下面的代码..

\AnandPatel\SeoExtension\Models\BlogPost::extend(function($model) 
            $model->translatable[] = 'seo_title';
        );

有人可以指导我如何使这些字段可翻译吗?

【问题讨论】:

【参考方案1】:

我调试了它,问题是

SEO Extension Plugin 正在侦听\Event::listen('backend.form.extendFields' ... ,此事件在backend.form.extendFieldsBefore 之后触发,因此新添加的字段不可翻译。

backend.form.extendFieldsBefore此事件负责将字段转换为translatable字段,因此在此事件之后添加的字段不会显示为translatable

一旦我有空闲时间,我计划纠正这种行为和 PR 贡献给作者 repo https://github.com/anand-patel/oc-seo-extension

解决方案可能是[需要在插件基本代码中完成]在SEO Extension Plugin中使用backend.form.extendFieldsBefore事件,并且在扩展字段期间它需要直接使用raw config,现在它使用$widget->addFields所以它必须删除它并直接将字段注入config,因此,稍后可以通过RainLab.Translate Plugin 使用backend.form.extendFieldsBefore 事件处理新添加的字段。

所以现在解决方法在您的自定义插件中添加已经支持跨国的字段,或者您可以再次使用 extendFieldsBefore 并使用 raw config 添加字段。

这里我们只是使用简单的解决方案并添加具有可翻译字段类型的覆盖字段

use RainLab\Blog\Models\Post;
use Event;
use System\Classes\PluginManager;

public function register() 

  Post::extend(function($post) 
      if (!$post->propertyExists('translatable')) 
          $post->addDynamicProperty('translatable', []);
      
      $post->translatable = array_merge($post->translatable, ['seo_title', 'seo_description' /* so on ....*/]);
  );

  Event::listen('backend.form.extendFields', function($widget) 
      if(PluginManager::instance()->hasPlugin('RainLab.Blog') && $widget->model instanceof \RainLab\Blog\Models\Post)
        
            $widget->addFields([
              'seo_title' => [
                  'label'   => 'Meta Title',
                  'type'    => 'mltext', //<- HERE
                  'tab'     => 'SEO'
              ],
              'seo_description' => [
                  'label'   => 'Meta Description',
                  'type'    => 'mltextarea', //<- HERE
                  'size'    => 'tiny',
                  'tab'     => 'SEO'
              ],
              'seo_keywords' => [
                  'label'   => 'Meta Keywords',
                  'type'    => 'mltextarea', //<- HERE
                  'size'    => 'tiny',
                  'tab'     => 'SEO'
              ],
              'canonical_url' => [
                  'label'   => 'Canonical URL',
                  'type'    => 'mltext', //<- HERE
                  'tab'     => 'SEO',
                  'span'    => 'left'
              ],
              'redirect_url' => [
                  'label'   => 'Redirect URL',
                  'type'    => 'mltext', //<- HERE
                  'tab'     => 'SEO',
                  'span'    => 'right'

              ],
              // ... so on
          ],
          'secondary');
        
  );

但这是标准解决方案的解决方法,我计划更正此问题并将 PR 推送给作者插件 repo 可能是 -> https://github.com/anand-patel/oc-seo-extension

如有任何疑问,请发表评论。

【讨论】:

以上是关于带有 SEO 插件的 OctoberCMS 翻译插件不会翻译 CMS 页面和博客的 SEO 关键字的主要内容,如果未能解决你的问题,请参考以下文章

使用静态页面插件在 OctoberCMS 上导航

OctoberCMS:如何在 Rainlab.User 插件中通过电子邮件设置用户帐户激活?

在 OctoberCMS 插件中使用 Omnipay

OctoberCMS 在前端获取插件的下拉值

OctoberCMS 如何使用插件扩展中的字段创建自定义用户注册表单

更新用户组 OctoberCMS rainlab 用户插件