Ремонтируем поле GUID у вложений
Поле guid в таблице post для вложений в 90% случаев ведет на сам файл - является УРЛом файла. Этим полем удобно пользоваться, чтобы в коде получить ссылку на файл, в обход стандартной функции WordPress wp_get_attachment_url(). Нужно это для экономии ресурсов, подробнее читайте тут.
Однако при переезде на другой домен заменить это поле у всех вложений - сложная задача. Чтобы сделать это быстро, используйте мой маленький плагин.
/**
* Plugin Name: Repair Attachment Guid
* Author: Kama
* Description: Regenerate attachments "guid" field in posts table in DB. <a class="button" href="?rep_attch_guid">Regenerate</a>.
* Version: 0.1
*/
if( ! is_admin() ){
return;
}
if( ! isset( $_GET['rep_attch_guid'] ) ){
return;
}
add_action( 'plugins_loaded', 'rep_attch_guid' );
function rep_attch_guid() {
global $wpdb;
if( ! current_user_can( 'manage_options' ) ){
return;
}
$attchs = $wpdb->get_results( $wpdb->prepare(
"SELECT SQL_CALC_FOUND_ROWS ID, guid FROM $wpdb->posts WHERE post_type = 'attachment' AND guid NOT REGEXP %s",
sprintf( "https?://%s.*", preg_quote( $_SERVER['HTTP_HOST'] ) )
) );
if( $attchs ){
$found = $wpdb->get_var( "SELECT FOUND_ROWS()" );
$done = [];
foreach( $attchs as $attch ){
$new_guid = wp_get_attachment_url( $attch->ID );
$up = $wpdb->update( $wpdb->posts, [ 'guid' => $new_guid ], [ 'ID' => $attch->ID ] );
if( $up ){
$done[] = $attch->ID;
}
}
add_action( 'admin_notices', function() {
echo '<div id="message" class="updated notice is-dismissible">
<p>Updated ' . count( $done ) . " from $found: " . implode( ', ', $done ) . '</p>
</div>';
} );
}
else{
add_action( 'admin_notices', function() {
echo '<div id="message" class="updated notice is-dismissible"><p>No GUID found for update</p></div>';
} );
}
}
Перед использованием обязательно создайте резервную копию БД.
Аналогичный плагин, только для управления всеми ревизиями вы можете найти в статье: Оптимизация производительности WordPress за счет постоянных ссылок (практика)