web-dev-qa-db-ja.com

コンテンツタイプのすべてのパスを再構築する

特定のコンテンツタイプのすべてのパスを変更したい。

たとえば、現在「イメージ」タイプのすべてのノードを変更します

/[some_token]/[nid]

/photo/[nid]

パスautoを使用していて、ノード(70k)がたくさんあるのですが、どうすればよいですか?

3
silkAdmin

これを解決する1つのアプローチは、カスタムモジュールの1つに更新スクリプトを追加することです hook_update_n() を参照し、それを pdate.php で実行します。

更新スクリプト内で、次のような更新クエリを実行できます

$ret = array();
$ret[] = update_sql("UPDATE {url_alias} a LEFT JOIN {node} n ON a.src = CONCAT('node/'. n.nid) SET a.dst = CONCAT('photo/', n.nid) WHERE n.type = 'image'");
return $ret;

これにより、「イメージ」タイプのノードの既存のすべてのURLエイリアスが更新されます。このクエリはテストしていないため、展開する前にテストするか、ローカルで確認する必要があります。

2
Aiias

@aliasの提案と同様に、 SQLクエリの作成 を実行して、url_aliasテーブルを調べ、必要なエイリアスを作成できます。

注:少数のノードの場合、答えははるかに単純です:

  1. Admin/config/search/path/patternsに移動して、そのコンテンツタイプの新しいURLパターンを定義します。
  2. 管理/コンテンツページを開きます。
  3. 特定のノードタイプでフィルタリングします。
  4. コンテンツアイテムの上にあるチェックボックスをオンにして、特定のタイプのすべてのアイテムを選択します。
  5. 「URLエイリアスの更新」操作を選択します。
  6. 「更新」を押します。

Update URL alias of nodes of a certain type

中程度の数のノードがある場合、他の2つのオプション:

  1. コアにハードコードされたページあたりのノード数を一時的に変更します 。これにより、一度に20を超えるノードで上記のオプションを使用できます。

  2. [〜#〜] vbo [〜#〜] コンテンツ管理ビューを作成して、ユーザーが同時に20を超えるノードを選択し、実行するアクションを選択できるようにします。

4
Druvision

Pathautoを使用するだけでよいと思います。 URLパターンの名前を変更し、一括更新機能を使用してすべてのエイリアスを再生成します。また、コンテンツの概要画面(/ admin/content)でコンテンツタイプ「画像」を除外し、すべてを選択して、ドロップダウンメニューから[URLエイリアスを更新]を選択して、これを行うこともできます。

3
Sidney Gijzen

クエリは回答されていますが、私が経験に基づいてパス自動モジュールでバルクURLエイリアスを作成するために試した方法を共有したいと思います。これは、非常に大きなエイリアスコンテンツの同様の懸念を探している人に役立つことを期待しています一般的な方法で:

Drushメソッドの例で、50ノードのループで特定のタイプの1000個の公開ノードにエイリアスを設定します

drush eval '$start=0;$limit_count=50;$break_at=1000;
while (1) { $resource = db_query("SELECT nid FROM node WHERE type=\"MY_NODE_TYPE_TO_UPDATE\" AND status=1 LIMIT $start, $limit_count");
while($result = db_fetch_object($resource)) $nodes[] = $result->nid;
pathauto_node_operations_update($nodes);
foreach ($nodes as $nid) print "\n $nid";
print "\n Completed aliasing set of $limit_count nodes";
unset($nodes);
$start += $limit_count;
if ($start >= $break_at) break;
}'

自動更新ページを作成し(メタタグを設定して)、10秒ごとにバルクエイリアスの更新を実行しますdrupal.orgから参照 pathautoバルク生成ページ

<?php
  include_once './includes/bootstrap.inc';
  include_once './sites/all/modules/pathauto/pathauto.inc';
  include_once './sites/all/modules/pathauto/pathauto_node.inc';    
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>

<html>

<head>
<meta http-equiv="refresh" content="10">
</head>

<body>
Created new URL aliases at <strong><?php print date('r') ?></strong> :: Restarting in 10 seconds ...
</body>

</html>
<?php
  variable_set('pathauto_max_bulk_update', 1000); // Or how many nodes you think you have :)
  variable_set('pathauto_transliterate', TRUE);
  node_pathauto_bulkupdate();
?>

私の場合、エイリアスの更新は、カスタムモジュールで作成されたいくつかの複雑なトークンを含む約10万のノードに対するものでした(その結果、涙が多くなりました)、drushメソッドは非常に遅くなり、長期間実行されるメタタグメソッドが表示されましたサーバーをチョークする。

より良い方法である程度機能すると思われる別の方法は、Drupalの Batch API を使用することでした。

すべての公開されたMY_NODE_TYPEノードを更新するサンプルバッチAPIコード

/**
 * Callback function for regenerating MY_NODE_TYPE alias batch job
 */
function regenerate_MY_NODE_TYPE_alias_form() {
  $form = array();
  $form['#submit'][] = 'regenerate_MY_NODE_TYPE_alias_form_submit';
  $confirmation_question = 'Are you sure you wish to regenerate the alias of all MY_NODE_TYPE nodes?';
  return confirm_form($form, $confirmation_question, $path = 'admin', $description = NULL, $yes = "Confirm and Regenerate MY_NODE_TYPE Node alias", $no = "Cancel", $name = 'confirm_regeneration');
}

/**
 * form submit function for MY_NODE_TYPE alias generation batch job
 *
 * @see regenerate_MY_NODE_TYPE_alias_form()
 */
function regenerate_MY_NODE_TYPE_alias_form_submit() {
  $batch = array(
    'init_message' => t('Regeneration of MY_NODE_TYPE alias in progress'),
    'operations' => array(),
    'finished' => '_regenerate_MY_NODE_TYPE_node_alias_complete',
    'error_message' => t('MY_NODE_TYPE alias Batch has encountered an error.'),
    'title' => t('Rebuilding MY_NODE_TYPE alias'),
  );
  $batch['operations'][] = array('_regenerate_MY_NODE_TYPE_node_alias', array());
  watchdog("form_submit", "MY_NODE_TYPE alias batch array initialized, before calling batch_set");
  batch_set($batch);
}

/**
 * Function responsible for regeneration of MY_NODE_TYPE nodes' titles
 */
function _regenerate_MY_NODE_TYPE_node_alias(array &$context) {
  if (!isset($context['sandbox']['progress'])) {
    $context['results'][] = '';
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['start_value'] = 0;
    // select all published MY_NODE_TYPE nodes
    $context['sandbox']['max'] = db_result(db_query("SELECT COUNT(nid) FROM {node} WHERE `type` = '%s' AND `status` = 1", 'MY_NODE_TYPE'));
    watchdog("Alias max_value", "Alias Batch maximum value set " . $context['sandbox']['max']);
  }
  watchdog("alias regeneration", "Current progress value is " . $context['sandbox']['progress']);
  $fetch_limit = 100;
  $nid_rs = db_query_range("SELECT `nid` FROM {node} WHERE `type` = '%s' AND `status` = %d", $args = array('MY_NODE_TYPE', 1), $from = $context['sandbox']['progress'], $fetch_limit);

  while ($MY_NODE_TYPE_nid_arr = db_fetch_array($nid_rs)) {
    $context['results'][] = $MY_NODE_TYPE_nid_arr['nid'];
    $MY_NODE_TYPE_nodes[] = $MY_NODE_TYPE_nid_arr['nid'];
  }
  // call pathauto mass update method with the array of nodes retrieved
  pathauto_node_operations_update($MY_NODE_TYPE_nodes);
  $context['sandbox']['progress'] += 100;
  $context['message'] = t("Now processing node %nid. (%progress of %total)", array('%nid' => $MY_NODE_TYPE_nid_arr['nid'], '%progress' => $context['sandbox']['progress'], '%total' => $context['sandbox']['max']));
  if ($context['sandbox']['progress'] >= $context['sandbox']['max']) {
    $context['finished'] = 1;
  }
  else {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
}

/**
 * @function success handler for MY_NODE_TYPE alias generation
 */
function _regenerate_MY_NODE_TYPE_node_alias_complete($success, $results, $operations) {
  drupal_set_message("Completed batch operation");
  if ($success) {
    $message = count($results) . ' MY_NODE_TYPEs processed.';
    // $message .= theme('item_list', $results);  // lists all nodes that were processed
    drupal_set_message($message);
  }
  else {
    $error_operation = reset($operations);
    $message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
    watchdog('alias batch_error', $message);
    drupal_set_message($message, 'error');
  }
}
1
optimusprime619

Drupal 7の場合、これは簡単です。モジュール「ビュー一括操作」、「管理ビュー」、チュートリアルはこちら: https://drupal.org/node/1326928 が必要です。 =

0
Jeremy John