Intereting Posts
meta_query сравнение даты и времени Тематические страницы Загружать изображения и вложения из формы интерфейса Предложения по одеванию блога для праздников Отображение недавних выдержек на статической главной странице Перенаправление WordPress: URL-адрес сброса пароля по умолчанию Функция запуска ПОСЛЕ ИЗМЕНЕНИЙ параметров темы? Использование нескольких настроек_поле () на странице настроек 1 Использование прямого вызова базы данных без ошибки кэширования Сколько я должен беспокоиться об этих сообщениях? Как добавить определенную фразу в конец поискового URL Как остановить перенаправление, если пользователь уже находится на правильной странице (с помощью переключателя Case) Лучшая практика для ограничения результатов в get_row ()? Сохранять значения, сгенерированные через API, как термины таксономии Пользовательская таксономическая разбивка на страницы

Как сделать тактику «tag» и «category» (default) «save_post»?

Я пытаюсь заменить категории metabox тем, что выглядит и работает как метабокс тегов, потому что слишком много иерархии и прокрутки для проверки соответствующих категорий и подкатегорий не является вариантом. Так что в моем случае лучше всего использовать мета-обмен меток.

Вот как я это делаю:

/* * Non-hierarchal metabox for categories * (like the tags metabox) * * SOURCES: * http://wordpress.stackexchange.com/a/50098 * http://wordpress.stackexchange.com/a/49048 * http://wordpress.stackexchange.com/a/48816 * */ // De-register categories metabox add_action( 'admin_menu', 'flatsy_remove_meta_box' ); function flatsy_remove_meta_box() { remove_meta_box( 'categorydiv', 'post', 'normal' ); } // Add new taxonomy meta box add_action( 'add_meta_boxes', 'flatsy_add_custom_cat_meta_box' ); function flatsy_add_custom_cat_meta_box() { add_meta_box( 'flatsy_categorydiv', 'Categories', 'flatsy_custom_cat_metabox', 'post', 'side', 'core' ); } // This function determines what displays in your metabox function flatsy_custom_cat_metabox( $post ) { $defaults = array('taxonomy' => 'category'); if ( !isset($box['args']) || !is_array($box['args']) ) $args = array(); else $args = $box['args']; extract( wp_parse_args($args, $defaults), EXTR_SKIP ); $tax_name = esc_attr($taxonomy); $taxonomy = get_taxonomy($taxonomy); $disabled = !current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : ''; ?> <div class="tagsdiv" id="<?php echo $tax_name; ?>"> <div class="jaxtag"> <div class="nojs-tags hide-if-js"> <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p> <textarea name="<?php echo "tax_input[$tax_name]"; ?>" rows="3" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" <?php echo $disabled; ?>><?php echo get_terms_to_edit( $post->ID, $tax_name ); // textarea_escaped by esc_attr() ?></textarea></div> <?php if ( current_user_can($taxonomy->cap->assign_terms) ) : ?> <div class="ajaxtag hide-if-no-js"> <label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $box['title']; ?></label> <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div> <p><input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" /> <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p> </div> <p class="howto"><?php echo esc_attr( $taxonomy->labels->separate_items_with_commas ); ?></p> <?php endif; ?> </div> <div class="tagchecklist"></div> </div> <?php if ( current_user_can($taxonomy->cap->assign_terms) ) : ?> <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p> <?php endif; ?> <?php } 

Эта часть кода работает так, как должна … видеть …

The categories metabox now looks like the tags metabox

… за исключением того, что он не сохраняет метаданные категории при сохранении сообщения. Немного поиска показало, что я должен делать что-то вроде этого :

 <?php add_action( 'save_post', 'cd_meta_box_save' ); function cd_meta_box_save( $post_id ) { // Bail if we're doing an auto save if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; // if our nonce isn't there, or we can't verify it, bail if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return; // if our current user can't edit this post, bail if( !current_user_can( 'edit_post' ) ) return; // now we can actually save the data $allowed = array( 'a' => array( // on allow a tags 'href' => array() // and those anchors can only have href attribute ) ); // Make sure your data is set before trying to save it if( isset( $_POST['my_meta_box_text'] ) ) update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) ); if( isset( $_POST['my_meta_box_select'] ) ) update_post_meta( $post_id, 'my_meta_box_select', esc_attr( $_POST['my_meta_box_select'] ) ); // This is purely my personal preference for saving check-boxes $chk = isset( $_POST['my_meta_box_check'] ) && $_POST['my_meta_box_select'] ? 'on' : 'off'; update_post_meta( $post_id, 'my_meta_box_check', $chk ); } ?> 

Но поскольку я имею дело с функциональностью по умолчанию (то есть, как / то, что WordPress уже делает с тегами metoxox), я хочу знать, какие проверки существуют для save_post для мета-полей категории и метатеги и как WordPress делает это по умолчанию ,

 // Save post metadata when a post is saved. add_action( 'save_post', 'flatsy_save_cat_meta' ); function flatsy_save_cat_meta( $post_id, $post, $update ) { return 'WHAT DO I DO HERE? HOW DOES WORDPRESS DO IT FOR THE TAGS METABOX?'; } 

И если это не так, как это делается, что должен выглядеть код, когда я конвертирую метабокс категории, чтобы выглядеть как метабокс тега и наоборот (два случая)?


CLARIFICATION: Я не хочу менять категории от иерархического до неиерархического. Я просто хочу метабокс для категорий. Если бы я хотел не иерархическую таксономию, я бы просто зарегистрировал обычную таксономию.

Solutions Collecting From Web of "Как сделать тактику «tag» и «category» (default) «save_post»?"

/wp-admin/post.php файл /wp-admin/post.php , содержащий функцию wp_update_post() , которая вызывает wp_update_post() , которая является wp_insert_post() оболочкой.

Вот скелет для сохранения присвоенных терминов категории:

 /** * Saving assigned category terms (skeleton) */ add_action( 'admin_action_editpost', function() { add_filter( 'wp_insert_post_data', function( $data, $parr ) { add_action( 'save_post_post', function( $post_ID, $post ) use ( $parr ) { if( isset( $parr['_wpnonce'] ) && wp_verify_nonce( $parr['_wpnonce'], 'update-post_' . absint( $post_ID ) ) && current_user_can( 'manage_categories' ) && function_exists( 'wpse_save_assigned_cats' ) && ! did_action( 'wpse_save_assigned_cats' ) ) { wpse_save_assigned_cats( $post_ID, $parr ); do_action( 'wpse_save_assigned_cats' ); } }, 10, 2 ); return $data; }, 10, 2 ); } ); 

где наша вспомогательная функция wpse_save_assigned_cats() основана на функции edit_post() :

 /** * Helper function based on the cat/tax handling of the edit_post() functions */ function wpse_save_assigned_cats( $post_ID, $parr ) { if( ! empty( $parr['tax_input']['category'] ) && $post_ID > 0 ) { // Change the comma seperated string of category names, // in $parr['tax_input']['category'], to an array of cats id $input_cats = explode( ',', trim( $parr['tax_input']['category'], " \n\t\r\0\x0B," ) ); $clean_cats = array(); foreach ( $input_cats as $cat_name ) { // Don't allow empty categories if ( empty( $cat_name ) ) continue; // Check if there already exists such a category $_cat = get_terms( 'category', array( 'name' => $cat_name, 'fields' => 'ids', 'hide_empty' => false, ) ); // The category name already exists if ( ! empty( $_cat ) ) { // Collect the (first) category id $clean_cats[] = intval( $_cat[0] ); } else { // Create the category, since it doesn't exists $cat_id = wp_create_category( $cat_name ); // Collect the category id if( $cat_id > 0 ) $clean_cats[] = $cat_id; } } // Current post's category IDs $cats = (array) wp_get_post_categories( $post_ID, array( 'fields' => 'ids' ) ); // Unique array of category IDs $post_categories = array_unique( array_merge( $cats, $clean_cats ) ); // Assign the categories to the current post wp_set_post_categories( $post_ID, $post_categories ); } } 

Предыдущий ответ:

Вот мой ответ в пятницу, поэтому может потребоваться некоторое тестирование 😉

Я просто перерегистрировал таксономию category как неиерархическую с:

  'hierarchical' => false, 

Затем окно категории появилось следующим образом:

категория

и условия экономии работали, как ожидалось.

Вот мой фрагмент кода для тестирования, поэтому вы можете попробовать его дальше:

 add_action( 'init', function() { global $wp_rewrite; register_taxonomy( 'category', 'post', array( 'hierarchical' => false, 'query_var' => 'category_name', 'rewrite' => array( 'hierarchical' => true, 'slug' => get_option('category_base') ? get_option('category_base') : 'category', 'with_front' => ! get_option('category_base') || $wp_rewrite->using_index_permalinks(), 'ep_mask' => EP_CATEGORIES, ), 'public' => true, 'show_ui' => true, 'show_admin_column' => true, '_builtin' => true, 'labels' => array( 'name' => __( 'Categories' ), 'singular_name' => __( 'Category' ), 'search_items' => __( 'Search Categories' ), 'popular_items' => null, 'all_items' => __( 'All Categories' ), 'edit_item' => __( 'Edit Category' ), 'update_item' => __( 'Update Category' ), 'add_new_item' => __( 'Add New Category' ), 'new_item_name' => __( 'New Category Name' ), 'separate_items_with_commas' => null, 'add_or_remove_items' => null, 'choose_from_most_used' => null, ), 'capabilities' => array( 'manage_terms' => 'manage_categories', 'edit_terms' => 'manage_categories', 'delete_terms' => 'manage_categories', 'assign_terms' => 'edit_posts', ), ) ); } ); 

Как сделать тактику «tag» и «category» (default) «save_post»?

Они этого не делают!

Таксономии не обрабатываются действием save_post , все происходит непосредственно внутри wp_insert_post . Вы можете увидеть это в источнике здесь .

Вы можете использовать wp_set_object_terms в своем wp_set_object_terms чтобы сохранить условия из своего пользовательского обмена.