WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Ремонтируем поле 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 за счет постоянных ссылок (практика)

1 комментарий
    Войти