既に多くのノードがあるDrupal 7コンテンツタイプに新しい(テキスト)フィールドを追加しました。
これらのすべてのノードのデフォルト値をフィールドに入力するにはどうすればよいですか?
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関数を使用して上記を実行できます。それ以外の場合は、単純なカスタムモジュールを作成できます。
私は Views Bulk Operations を使用し、「Execute Arbitrary PHP Script」を使用して基本的に上記の項目を実行しますが、追加のコードをすべて実行する必要はありません、必要な機能を実行する小さなスニペット($object->field_foo['und'][0]['value'] = 'some_value'
など)
ある値でフィールドを更新したいだけなら、受け入れられた答えのより高性能な代替はこれです:
$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_presave
およびfield_attach_update
関数。ノードフィールドのみを正しく更新し、残りのノード保存プロセスをスキップします。これは、ノードの事前保存/保存フックが呼び出されない、「変更された」日付が現在の日付に更新されないなどの影響があります。ユースケースによっては、node_save()プロセス全体を使用する方がよい場合があります。
実際、VBO(Views Bulk Operations)は優れたソリューションです。さらに、最新バージョンでは、1回の操作でノードの言語を更新する非常に簡単な方法を提供するオプション「エンティティ値の変更」があります。
Views Bulk Operations モジュールをインストールして有効にし、ページ表示付きのビューを作成します。
追加=>一括操作:ビューのコンテンツ(コンテンツ)フィールド。
参照
デフォルト値を設定するフィールドを選択します。
あなたの場合、そのタイトル。画像ではタグです。
ビューを保存し、作成したページに移動します。結果のページが複数ある場合は、現在のページのすべてのアイテム、すべてのページのすべてのアイテムを選択するか、個々のノードに対応するボックスを手動でチェックできます。続行するには、少なくとも1つのチェックボックスをオンにする必要があります。
次に、デフォルト値を設定して保存します。