Drupal 8 孤儿段落

Ela*_*man 6 drupal paragraph drupal-8

我注意到 Paragraph 实体没有从数据库中删除。他们宁愿取消与父节点的链接。

如果您创建一个视图,该视图列出段落并附加上下文过滤器,该过滤器按Parent ID.

现在,我找到了一种解决方法,可以创建一个列出内容的视图。将关系附加到段落。这样可以确保只显示链接的段落。

仍然存在数据库中有数百个孤立段落和字段数据的问题。有没有办法清理它们?

编辑: 这显然是一个主要错误,可以在段落模块的问题跟踪器中找到:已删除的段落实体不会从数据库中删除

Ela*_*man 7

现在我已经发现这是一个错误并且尚未修复,我的主要目标是清理孤立的段落。

有人创建了这个模块:Paragraph clean,但我不喜欢将模块用于此类目的。

所以,下面我将发布我第一次成功尝试解决它。我必须警告这不安全,因为它会删除段落!

该解决方案未针对使用修订、内容翻译等进行测试。因此这可能会毁了您的一天。备份您的网站

使用Devel模块,转到Development> Execute PHP Code。粘贴并执行以下代码:

// get all paragraphs
$deleted = [];
$paragraph_ids = \Drupal::entityQuery('paragraph')->execute();
$paragraphs = \Drupal::entityTypeManager()->getStorage('paragraph')->loadMultiple($paragraph_ids);
foreach ($paragraphs as $target_id => $paragraph) {
  // get parent entity (node, taxonomy, paragraph, etc.)
  $parent = $paragraph->getParentEntity();
  $field_name = $paragraph->parent_field_name->value;

  // Check if current paragraph exists in parent entity field values
  $exists = FALSE;
  $values = is_null($parent) ? [] : $parent->get($field_name)->getValue();
  foreach($values as $value) {
    if ($value['target_id'] == $target_id) {
      $exists = TRUE;
    }
  }

  // Delete paragraphs that aren't linked to an entity they claim as a parent
  if (!$exists) {
    $paragraph->delete();
    $deleted[] = $target_id;
  }
}

print "Deleted paragraph IDs: " . implode(', ', $deleted);
Run Code Online (Sandbox Code Playgroud)