一括フィールド更新?


35

既に多くのノードがあるDrupal 7コンテンツタイプに新しい(テキスト)フィールドを追加しました。

これらすべてのノードのデフォルト値をフィールドに入力するにはどうすればよいですか?

回答:


37

を使用EntityFieldQueryしてノードのリストを取得し、次のようにノードのフィールドを更新できますnode_save()

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

これが1回限りの操作である場合、DevelモジュールのExecute PHP関数を使用して上記を実行できます。それ以外の場合は、単純なカスタムモジュールを作成できます。


2
develまたはvboを使用するほかに、「drush scr myscript.php」を使用して、完全にブートストラップされた環境で上記のコードを実行することもできます。
-fietserwin

用語参照フィールドに対して同じ操作を実行するために、このコードはどのように変更されますか?
スクリーンバッグ

17

私が使用するビューが操作を一括して上記の基本的項目を行うには、「任意のPHPスクリプトを実行」を使用しますが、すべての余分なコード、あなたは(のように何をしたいんほんの少しスニペットを行う必要はありません$object->field_foo['und'][0]['value'] = 'some_value'


9

何らかの値でフィールドのみを更新したい場合、受け入れられた回答に対するよりパフォーマンスの高い代替はこれです:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

違いは、直接使用することfield_attach_presavefield_attach_update、ノードフィールドのみを正しく更新し、ノード保存プロセスの残りをスキップする関数です。これは、ノードの事前保存/保存フックが呼び出されない、「変更された」日付が現在の日付などに更新されないなどの影響があります。


4

実際、VBO(Views Bulk Operations)は優れたソリューションです。さらに、最新バージョンでは、1回の操作でノードの言語を更新する非常に簡単な方法を提供する「エンティティ値の変更」オプションがあります。


2

Views Bulk Operationsモジュールをインストールして有効にし、ページ表示のあるビューを作成します。

追加=>一括操作:ビュー内のコンテンツ(コンテンツ)フィールド。

参照

ここに画像の説明を入力してください

デフォルト値を設定するフィールドを選択します。

あなたの場合、そのタイトル。画像ではタグです。

ビューを保存し、作成したページに移動します。結果のページが複数ある場合は、現在のページのすべてのアイテム、すべてのページのすべてのアイテムを選択するか、個々のノードに対応するボックスを手動で選択できます。続行するには、少なくとも1つのチェックボックスをオンにする必要があります。

次に、デフォルト値を設定して保存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.