В WordPress post_modified сделать одинаковым post_date?

Ссылка скопирована
1 ответ

Приветствую, уважаемые специалисты.

Нашёл на просторах Интернета код, но он не работает. Что не так?

Оный должен при сохранении поста устанавливать дату модификации равной дате поста. Причём оная может быть как прошлая, так и сильно будущая (ещё не наступившая).

function update_modified_date_to_post_date( $post ) {     global $wpdb;     $wpdb->query("UPDATE $wpdb->posts SET post_modified = '{$post->post_date}', post_modified_gmt = '{$post->post_date_gmt}' WHERE ID = {$post->ID}" ); } add_action( 'publish_post', 'update_modified_date_to_post_date', 10, 1 );

function update_modified_date_to_post_date( $post ) { global $wpdb; $wpdb->query("UPDATE $wpdb->posts SET post_modified = '{$post->post_date}', post_modified_gmt = '{$post->post_date_gmt}' WHERE ID = {$post->ID}" ); } add_action( 'publish_post', 'update_modified_date_to_post_date', 10, 1 );

Дополнительные вопросы

Ответы:

Чтобы при создании или редактировании записи дата изменения устанавливалась из даты создания можно использовать этот код в файле functions.php вашей темы, он просто обновляет аттрибуты записи:

function update_modified_date_to_post_date($post_id) { 	// Получаем дату создания записи 	$creation_date = get_the_date('Y-m-d H:i:s', $post_id);  	// Обновляем дату изменения записи 	$update_args = array( 		'ID' => $post_id, 		'post_modified' => $creation_date, 		'post_modified_gmt' => get_gmt_from_date($creation_date), 	);  	if ( ! wp_is_post_revision( $post_id ) ){ 		// удаляем этот хук, чтобы он не создавал бесконечного цикла 		remove_action('save_post', 'update_modified_date_to_post_date');  		// обновляем пост, когда снова вызовется хук save_post 		wp_update_post($update_args);  		// снова вешаем хук 		add_action('save_post', 'update_modified_date_to_post_date'); 	} 	 } add_action('save_post', 'update_modified_date_to_post_date');

function update_modified_date_to_post_date($post_id) { // Получаем дату создания записи $creation_date = get_the_date('Y-m-d H:i:s', $post_id); // Обновляем дату изменения записи $update_args = array( 'ID' => $post_id, 'post_modified' => $creation_date, 'post_modified_gmt' => get_gmt_from_date($creation_date), ); if ( ! wp_is_post_revision( $post_id ) ){ // удаляем этот хук, чтобы он не создавал бесконечного цикла remove_action('save_post', 'update_modified_date_to_post_date'); // обновляем пост, когда снова вызовется хук save_post wp_update_post($update_args); // снова вешаем хук add_action('save_post', 'update_modified_date_to_post_date'); } } add_action('save_post', 'update_modified_date_to_post_date');

  • Спасибо, что откликнулись. Но что-то код вообще не работает.

    Я пытался установить дату на год назад и ещё установить на год вперед. Дата поста, как и полагается, меняется, а вот дата модификации остаётся текущей. Я не просто так привёл решение с помощью прямой записи в базу данных, так как необходимо чтобы прописывалась дата модификации ровно та, что указывается у даты поста. Она может быть как прошлая, так и сильно будущая.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Backend-редакция Ответ

Код не сработает стабильно, потому что вы передаёте в функцию объект $post, но hook может передавать другие аргументы, плюс прямой SQL внутри сохранения может вызвать неожиданные эффекты. Для задачи «при сохранении сделать post_modified равным post_date» лучше использовать фильтр данных перед вставкой в базу: wp_insert_post_data.

Пример:

add_filter('wp_insert_post_data', function ($data, $postarr) {
    if (empty($data['post_date']) || empty($data['post_date_gmt'])) {
        return $data;
    }
 
    if (! empty($postarr['post_type']) && $postarr['post_type'] === 'revision') {
        return $data;
    }
 
    $data['post_modified']     = $data['post_date'];
    $data['post_modified_gmt'] = $data['post_date_gmt'];
 
    return $data;
}, 20, 2);

add_filter('wp_insert_post_data', function ($data, $postarr) { if (empty($data['post_date']) || empty($data['post_date_gmt'])) { return $data; } if (! empty($postarr['post_type']) && $postarr['post_type'] === 'revision') { return $data; } $data['post_modified'] = $data['post_date']; $data['post_modified_gmt'] = $data['post_date_gmt']; return $data; }, 20, 2);

Так вы меняете данные до записи в базу, а не делаете отдельный UPDATE после сохранения. Это чище и меньше конфликтует с WordPress.

Если нужно только для записей определённого типа, добавьте проверку:

if (($data['post_type'] ?? '') !== 'post') {
    return $data;
}

if (($data['post_type'] ?? '') !== 'post') { return $data; }

Нужно понимать последствия: многие темы, SEO-плагины и sitemap используют post_modified, чтобы показывать дату обновления и отдавать lastmod. Если вы всегда приравниваете её к дате публикации, поисковики и пользователи не увидят реальные обновления материала.

Если цель — скрыть дату обновления на фронте, лучше править вывод даты в шаблоне, а не менять системное поле в базе. Но если именно база должна хранить одинаковые даты, используйте фильтр перед сохранением.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно