WordPress как на ладони
wordpress jino

Обновление дополнительного (созданного) поля в таблице wp_posts

Добавил новое поле в таблицу wp_posts, column = coin

При обновлении поста, поле просто не обновляется, игнорируется как будто его просто нет.

function dl_create_post($post_id) {
	$new_post_atr = array(
		'ID' => 1,
		'coin' => 12,
		'post_title'=> '553'
	);
	if (!wp_is_post_revision($post_id)) {
		// удаляем этот хук, чтобы он не создавал бесконечного цикла
		remove_action('save_post', 'dl_create_post');
		// обновляем пост, когда снова вызовется хук save_post
		wp_update_post($new_post_atr);
		// снова вешаем хук
		add_action('save_post', 'dl_create_post');
	}
		// Обновляем данные в БД
}

add_action('save_post', 'dl_create_post');
1
Гость 2.8 года назад
  • 0
    Kama4639

    Вам нужно отдельно указать поле coin. По умолчанию обрабатываются только эти поля (из кода wp_insert_post()):

    $data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid' );

    Сделать это можно через фильтр:

    $data = apply_filters( 'wp_insert_post_data', $data, $postarr );

    Т.е. для вас код будет такой (не проверял отпишитесь плз):

    // добавим новое поле coin для обработки во время обновления записи через wp_insert_post() или wp_update_post().
    add_filter('wp_insert_post_data', 'wp_insert_post_add_field', 10, 2);
    function wp_insert_post_add_field( $data, $postarr ){
    	// выходим если не установлено новое поле
    	if( ! isset( $postarr['coin'] ) ) return $data;
    
    	// добавим поле в обновляемые данные, очистим его
    	$data['coin'] = (int) $postarr['coin']; // только числовые значения
    
    	return $data;
    }

    Так мы добавили в обработку поле 'coin' во время обновления/создания записи. Но тут разумеется, как в вашем примере нужно указывать поле отдельно:

    $new_post_atr = array(
    	'ID' => 1,
    	'coin' => 12, // !!!
    	'post_title'=> '553'
    );

    Этот хук нужно разместить до вашего кода, т.е. до того, как будет вызвана функция wp_insert_post() или wp_update_post().

    П.С. для подробной информации зайдите в описание wp_insert_post() и загляните в её код...

    Комментировать
  • 1
    campusboy1948 cайт: www.youtube.com/c/wpplus

    После Тимура, конечно, добавить уже нечего. У меня один вопрос, почему не использовали произвольные поля для решения такой задачи? Они ведь как раз для этого и созданы!

    Комментировать
  • 0

    Здравствуйте,
    Тема моя.
    Первоначально решил проблему добавлением отдельно поля в массив.

    $data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt',
     'post_status', 'post_type','comment_status', 'ping_status','post_password',
     'post_name', 'to_ping','pinged', 'post_modified', 'post_modified_gmt',
     'post_parent', 'menu_order', 'post_mime_type', 'guid' );

    Но потом пришёл к выводу, что это крайне неправильно, так как нарушает целостность ядра и пошел по пути создания отдельной таблицы.

    В принципе сейчас все данные так и хранятся, в отдельной таблице, которая создаётся при активации плагина.

    На сайте не нашёл информации по монетизации плагинов.

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

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.