Tôi cần xóa tất cả các sửa đổi nút trước khi nâng cấp lên Drupal 7 để tiết kiệm thời gian di chuyển. Có cách nào để làm điều đó?
Tôi cần xóa tất cả các sửa đổi nút trước khi nâng cấp lên Drupal 7 để tiết kiệm thời gian di chuyển. Có cách nào để làm điều đó?
Câu trả lời:
Bạn có thể sử dụng mã sau đây.
db_query('DELETE FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');
Bạn không muốn xóa tất cả các sửa đổi: Bạn muốn xóa tất cả trừ sửa đổi hiện tại.
Chỉ thực hiện truy vấn đó sẽ để lại dữ liệu về các bản sửa đổi bị xóa trong các bảng cơ sở dữ liệu khác, vì các mô-đun lưu thông tin về bản sửa đổi không được thông báo rằng bản sửa đổi sẽ bị xóa. Tôi đang nghĩ về mô-đun CCK, ví dụ, để lưu thông tin về các trường nút trong các bảng cơ sở dữ liệu của chính nó. Mô-đun CCK thực thi mã sau đây, khi sửa đổi bị xóa.
/**
* Implementation of hook_nodeapi 'delete_revision' op.
*
* Delete node type fields for a revision.
*/
function content_delete_revision(&$node) {
_content_field_invoke('delete revision', $node);
_content_field_invoke_default('delete revision', $node);
cache_clear_all('content:'. $node->nid .':'. $node->vid, content_cache_tablename());
}
Một mã hoàn chỉnh hơn sẽ tương tự như mã sau đây.
$query = db_query('SELECT nr.nid, nr.vid FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');
while ($revision = db_fetch_object($query)) {
if ($node = node_load($revision->nid, $revision->vid)) {
node_invoke_nodeapi($node, 'delete revision');
}
}
db_query('DELETE FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');
Nhìn vào mã của node_Vvision_delete_confirm_submit () , tôi không thấy bất cứ điều gì khác cần phải làm.
Mã mới tôi đã viết có thể mất nhiều thời gian để được thực thi, tùy thuộc vào số lượng nút và sửa đổi. Điều này có nghĩa là mã phải được thực thi:
@set_time_limit(240)
Xem xét rằng mã chỉ cần thiết cho việc di chuyển, tôi sẽ tránh hai tùy chọn đầu tiên, sẽ yêu cầu bạn viết một mô-đun bạn cần chỉ trong trường hợp rất cụ thể này. Nếu bạn có nhiều trang web hơn và tất cả chúng cần thực thi cùng một mã, tùy chọn 3 luôn có thể và đó là những gì được thực hiện từ Drupal với cron.php .
Về tùy chọn 4, trước tiên tôi sẽ kiểm tra Drush không có các lệnh có thể hữu ích trong trường hợp này. Tôi sẽ không phát minh lại bánh xe, khi nó không thực sự cần thiết. Tôi cũng sẽ kiểm tra cách viết Drush Shell ScScript .
(SELECT n.vid FROM {node} n)
. Nếu không, bạn sẽ gặp lỗi SQL về tên cột xấu.
Chúng tôi đã có một trang web với> 500.000 bản sửa đổi cũ trong cơ sở dữ liệu của họ. Có một mô-đun đẹp để loại bỏ một số lượng nhỏ các bản sửa đổi được gọi là http://drupal.org/project/revision_deletion . Nhưng, để nhanh chóng loại bỏ một bộ lớn, chúng tôi đã viết kịch bản này.
Ý tưởng chung là loại bỏ tất cả các sửa đổi cũ hơn một ngày nhất định và sau đó thực hiện tương tự cho mỗi bảng CCK. Bất kể giới hạn ngày nào bạn chọn bản sửa đổi hiện tại sẽ không bị xóa.
CẢNH BÁO: nó đưa ra các giả định về các quy ước đặt tên bảng của bạn - chỉ sử dụng trên một bản sao lưu
<?php
// Note - this is for Drupal 6.x
function remove_revisions() {
// Set limit for revision age
$days_ago = 30;
// delete all revisions from node_revisions
$limit = time() - (60*60*24*$days_ago);
$sql = "DELETE FROM node_revisions WHERE timestamp < $limit AND vid NOT IN (SELECT vid FROM node)";
db_query($sql);
$rows = db_affected_rows();
drupal_set_message("$rows revisions deleted -- node_revisions");
$table_types = array('content_field_%%', 'content_type_%%');
// remove orphaned data from CCK content tables
foreach($table_types as $table_type) {
$result= db_query("SHOW TABLES LIKE '$table_type'");
while ($row = db_fetch_array($result)) {
$table = current($row);
$sql = "DELETE FROM $table WHERE vid NOT IN (SELECT vid FROM node_revisions)";
db_query($sql);
$rows = db_affected_rows();
drupal_set_message("$rows revisions deleted -- $table");
}
}
}
?>
Nguồn: http://fivepaths.com/drupal-revision-removal-and-database-cleanup-by-brute-force
trong phpmyadmin
cứ làm đi :
XÓA TỪ nút numvutions WHERE node_Vvutions.vid KHÔNG IN (CHỌN nút.vid TỪ {nút});
Ajay singh rathore. Bangalore
Đoạn mã này đảm nhiệm việc sửa đổi nút và tất cả các phiên bản CCK. Nó không biết về bất kỳ mô-đun có thể nào khác tiết kiệm bản sửa đổi nhưng nó nhanh và bạn tránh nghĩ về cron, lô, giới hạn thời gian thực hiện hoặc Drush. Nó cũng có cài đặt giới hạn ngày như trong bao nhiêu ngày kể từ hôm nay trở đi, bạn không muốn xóa bản sửa đổi. Bạn phải đặt mã bên trong một số mô-đun và thêm hook_menu. Làm việc tốt cho tôi.
http://fivepaths.com/drupal-revision-removal-and-database-cleanup-by-brute-force
Chỉnh sửa ngày 3 tháng 8 năm 2015: Rất tiếc, trang đã biến mất. Tôi có thể đào cái này lên nếu ai đó muốn nó.