В wordpress есть замечательная возможность быстрого редактирования записи (Quick edit post), не заходя в нее.
Произвольное поле в панели быстрого редактирования
Добавим в панель быстрого редактирования произвольное поле (acf)
1. Добавляем колонку с пользовательским полем. price — slug поля.
function add_acf_columns ( $columns ) { $columns['price'] = 'Price'; return $columns; } add_filter ( 'manage_post_posts_columns', 'add_acf_columns' ); add_action( 'manage_posts_custom_column', 'rachel_carden_populating_my_posts_columns', 10, 2 ); function rachel_carden_populating_my_posts_columns( $column_name, $post_id ) { switch( $column_name ) { case 'price': echo '<div id="price-' . $post_id . '">' . get_post_meta( $post_id, 'price', true ) . '</div>'; break; } }
2. Добавляем произвольное поле в панель быстрого редатирования
bulk_edit_custom_box — хук массового редактирования
quick_edit_custom_box — хук быстрого редактирования
//add_action( 'bulk_edit_custom_box', 'rachel_carden_add_to_bulk_quick_edit_custom_box', 10, 2 ); add_action( 'quick_edit_custom_box', 'rachel_carden_add_to_bulk_quick_edit_custom_box', 10, 2 ); function rachel_carden_add_to_bulk_quick_edit_custom_box( $column_name, $post_type ) { switch( $column_name ) { case 'price': ?><fieldset class="inline-edit-col-right"> <div class="inline-edit-group"> <label> <span class="title">Price</span> <input type="text" name="price" value="" /> </label> </div> </fieldset><?php break; } }
3. Заполняем поле. Если зайти в быстрое редактирование, то поле не будут заполнено. Для этого подключаем скрипт.
add_action( 'admin_print_scripts-edit.php', 'rachel_carden_enqueue_edit_scripts' ); function rachel_carden_enqueue_edit_scripts() { wp_enqueue_script( 'rachel-carden-admin-edit', get_bloginfo( 'stylesheet_directory' ) . '/quick_edit.js', array( 'jquery', 'inline-edit-post' ), '', true ); }
Содержимое скрипта quick_edit.js
(function($) { // we create a copy of the WP inline edit post function var $wp_inline_edit = inlineEditPost.edit; // and then we overwrite the function with our own code inlineEditPost.edit = function( id ) { // "call" the original WP edit function // we don't want to leave WordPress hanging $wp_inline_edit.apply( this, arguments ); // now we take care of our business // get the post ID var $post_id = 0; if ( typeof( id ) == 'object' ) $post_id = parseInt( this.getId( id ) ); if ( $post_id > 0 ) { // define the edit row var $edit_row = $( '#edit-' + $post_id ); // get the release date var $price = $( '#price-' + $post_id ).text(); // populate the release date $edit_row.find( 'input[name="price"]' ).val( $price ); } }; })(jQuery);
Теперь поле должно заполнятся.
Механизм примерно следующий: с помощью jquery мы отлавливаем id записи из id diva который мы сами туда поместили в первом шаге.
4. Сохраняем изменения быстрого редактирования
add_action( 'save_post','rachel_carden_save_post', 10, 2 ); function rachel_carden_save_post( $post_id, $post ) { // don't save for autosave if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return $post_id; // dont save for revisions if ( isset( $post->post_type ) && $post->post_type == 'revision' ) return $post_id; if ( array_key_exists( 'price', $_POST ) ) update_post_meta( $post_id, 'price', $_POST[ 'price' ] ); }
5. Сохраняем изменения массового редактирования
Добавляем функцию
add_action( 'wp_ajax_rachel_carden_save_bulk_edit', 'rachel_carden_save_bulk_edit' ); function rachel_carden_save_bulk_edit() { // get our variables $post_ids = ( isset( $_POST[ 'post_ids' ] ) && !empty( $_POST[ 'post_ids' ] ) ) ? $_POST[ 'post_ids' ] : array(); $price = ( isset( $_POST[ 'price' ] ) && !empty( $_POST[ 'price' ] ) ) ? $_POST[ 'price' ] : NULL; // if everything is in order if ( !empty( $post_ids ) && is_array( $post_ids ) && !empty( $price ) ) { foreach( $post_ids as $post_id ) { update_post_meta( $post_id, 'price', $price ); } } }
А в созданный файл скрипта quick_edit.js, добавляем еще один скрипт (после существующего)
jQuery(document).ready(function($){ $( '#bulk_edit' ).live( 'click', function() { // define the bulk edit row var $bulk_row = $( '#bulk-edit' ); // get the selected post ids that are being edited var $post_ids = new Array(); $bulk_row.find( '#bulk-titles' ).children().each( function() { $post_ids.push( $( this ).attr( 'id' ).replace( /^(ttle)/i, '' ) ); }); // get the release date var $price = $bulk_row.find( 'input[name="price"]' ).val(); // save the data $.ajax({ url: ajaxurl, // this is a variable that WordPress has already defined for us type: 'POST', async: false, cache: false, data: { action: 'rachel_carden_save_bulk_edit', // this is the name of our WP AJAX function that we'll set up next post_ids: $post_ids, // and these are the 2 parameters we're passing to our function price: $price } }); }); });
Спасибо за код и пояснения — то, что я и искал!
А, что надо изменить, чтобы можно было делать тоже самое со страницами, а не с записями?
Спасибо, основная задача выполнена. Поля обновляются без захода в запись. Не получилось только чтобы в быстром редактирование, поле было заполнено. Оно пустое! Скажите, в шаге 3, мы подключаем скрипт в hedere между тегами ?? Или этот код вставляем в function просто без всяких тегов? Файл quick_edit.js заливать в корень сайта? Я так понял в коде №3 ‘/quick_edit.js’ — это путь к файлу? И последнее, файл quick_edit.js состоит из двух скриптов просто один ниже другого без всяких там разделителей и т.п? Прошу прощения, если где-то глупость сморозил. Но хотел бы до конца разобраться с этим.
Честно скажу, убил целый день на решение задачи с быстрым редактированием полей и уже не надеялся, но гугл всё-таки Вас мне выдал. Спасибо за ответы.
Функцию (add_action) вставляем в function.php. Скрипт (в последствии содержащий два скрипта) помещаем в корень папки темы. Если например скрипты лежат в отдельной папке (с названием js) в теме, то путь к скрипту будет следующий:
get_bloginfo( ‘stylesheet_directory’ ) . ‘/js/quick_edit.js
Спасибо за ответы. Скажите, функция сохранения изменения массового редактирования (шаг№5) — это не для того чтобы массово редактировать значения произвольных полей? У меня, допустим, задача сразу заполнить поля в нескольких записях, потом обновить одной кнопкой. Это возможно? Сейчас я не могу этого сделать. Если выбираю несколько записей, нажимаю изменить (МАССОВОЕ РЕДАКТИРОВАНИЕ), то могу редактировать только рубрики, автора, коммент и т.д, но не произвольные поля (их там нет). Если Вашими функциями не предусмотрено массовое редактирование произвольных полей через панель быстрого редактирования, то может Вы знаете как это реализовать? Был бы очень благодарен.