web-dev-qa-db-ja.com

ノード作成者を大幅に変更する正しい方法

$ user1が作成者であるすべてのノードを変更し、$ user2を作成者として設定します。私はこれを使用しますPHPコードと動作しますが、それは正しい方法ですか?または、バッチプロセスを使用して各ノードをロードして作成者を変更する必要がありますか?

   $num_updated = db_update('node')
      ->fields(array(
        'uid' => $user2->uid,
      ))
      ->condition('uid', $user1->uid, '=')
      ->execute();
3
Franperr

結局のところ、私の組織では重要な転職があり、全員が独自のノードを管理する必要があるため、モジュールを作成して適切に処理することにしました。私はそれを行うためにnode_load/node_save関数を使用しました。

必要に応じて、モジュールをサンドボックスに配置します。 https://drupal.org/sandbox/franperr/2109987 バグ/ヘルプ/新機能に関するメッセージを送信してください.

1
Franperr

Bulk Author Update モジュールを使用することも、 views bulk operations module を使用することもできます

最初の解決策は

  1. viewsviews_bulk_operations 、および admin_views モジュールをインストールします。
  2. コンテンツリスト(admin/content)に移動します。
  3. 結果をフィルタリングして、関心のあるノードを取得します。
  4. ノードの横にあるチェックボックスをオンにします(すべてを選択するオプションもあります)。
  5. 操作ドロップダウンから「作成者の変更」を選択し、「実行」ボタンをクリックします。
  6. 著者を変更したいユーザーを選択し、「次へ」ボタンをクリックします。

管理ビューはビューの一括操作を使用して、デフォルトのdrupal管理ビューをより便利なものでオーバーライドします。

1
Yusef

サイトが最小のトラフィックを期待しているときにcron実行で更新タスクをスケジュールできます。特定の時間にudpateプロセスをスケジュールするには、 elysia cron モジュールを使用できます。このようにして、リビジョンの更新も一括して更新でき、スクリプトはスタンドアロンとして実行されます。

ステップ1:updatタスクをスケジュールします(elysiaモジュールを使用している場合)。

function mymodule_cron_cronapi($op, $job = NULL) {

    $items['update_node_user_author'] = array(
    'description' => 'Update node user author',
    'rule' => '0 12 * * *', 
    'callback' => 'mymodule_update_node_author',
  );
 return $items;
}

 //cron call back
function mymodule_update_node_author() {
  // add logic to get $uid and $uid2
  // $uid is the user id you want to change for.
  // $uid2 is the user id you want to change with.
  exec("/usr/bin/php update_author.php $uid $uid2> /dev/null 2>&1 &");  
}

drupal rootにupdate_author.phpという名前のphpスクリプトを作成し、その中に以下のコードを追加します。

<?php

if (!isset($_SERVER['REMOTE_ADDR'])) {
  $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
}
$uid = $argv[1];
$uid2 = $argv[2];

define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

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

  if (isset($result['node'])) {
    $nids = array_keys($result['node']);
    $nodes = node_load('node', $nids);
  }
  foreach($nodes as $node) {
    $node = node_load($nid);
    $node->uid = $uid2;
    node_save($node);
  }
0
arpitr

最も快適でクリーンな解決策は、views_bulk_operationsモジュールに基づいてビューを準備することです(インストールすることを忘れないでください)。

これは私のエクスポートされたビューです (admin/structure/views/importにインポートできます).

0
Bobík