Пользовательский Метабокс с раскрывающимся списком Таксономии - Проблема сохранения
Моя цель была проста- создать пользовательский тип записи с пользовательским метабоксом с простым выпадающим списком терминов таксономии вместо использования тегов или флажков. Причина заключалась в том, чтобы редактор мог выбрать только один термин из списка таксономии.
После проб и ошибок мне, наконец, удалось найти способ использовать отличные инструменты для создания метабоксов, которые я использую в WP-Alchemy(http://farinspace.com/wpalchemy-metabox /) для создания моего метабокс и попросите его отобразить применимые термины в раскрывающемся списке.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить новый выбор из выпадающего меню, чтобы сохранить выбранное значение.
Для ясности... важно, чтобы с каждой записью в этом пользовательском типе записи был связан только один термин, что означает, что всякий раз, когда в раскрывающемся меню выбирается другое значение и запись сохраняется, необходимо убедиться, что предыдущий выбор не зарегистрирован.
Как уже упоминалось, я в настоящее время он отображает список терминов в раскрывающемся списке, и у меня также есть правильное отображение любого термина, который может быть связан.
У меня проблемы только с сохранением новых значений.
Из обширных исследований "кажется", что решение предполагает использование функций wordpress "wp_set_post_terms", которые далее объясняются здесь: http://codex.wordpress.org/Function_Reference/wp_set_post_terms Однако я не уверен, как правильно его использовать, чтобы добиваюсь желаемого результата.
Ниже я включил код, который я использую. Вполне возможно, что есть лучший способ сделать это, и я был бы признателен за любые предложения, которые у вас, ребята, могут возникнуть, также могли бы гарантировать, что соответствующие "проверки" выполняются, чтобы гарантировать, что данные не могут быть вставлены пользователями, которые не авторизованы.
FUNCTIONS.PHP ФАЙЛ (НИЖЕ ПОКАЗАНО СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ТИПА ЗАПИСИ И ТАКСОНОМИИ.
//////////////////////////////////////////////////////////////////////////////
// CUSTOM POSTTYPE FOR -- SERVICES
//////////////////////////////////////////////////////////////////////////////
add_action('init', 'services');
function services() {
register_post_type('services', array(
'labels' => array(
'name' => __('Services'),
'singular_label' => __('Service'),
'new_item' => __('Add a Service'),
'add_new' => __('Add a Service'),
'add_new_item' => __('Add a Service'),
'edit' => __('Edit Service'),
'edit_item' => __('Edit Service'),
'view' => __('View Service'),
'view_item' => __('View Service'),
'search_items' => __('Search Services'),
'not_found' => __('No Services Found'),
'not_found_in_trash' => __('No Services Found in Trash'),
'parent_item' => __('Parent Service'),
'parent_item_colon' => __('Parent Service:')
),
'can_export' => true,
'menu_position' => 7,
'public' => false,
'show_ui' => true,
'publicly_queryable' => true,
'hierarchical' => true,
'query_var' => true,
'capability_type' => 'post',
'exclude_from_search' => false,
'supports' => array(
'title',
'editor',
'revisions',
'page-attributes'
),
'rewrite' => array(
'slug' => 'disability-services',
'with_front' => false
)
));
}
ВОТ ГДЕ Я РЕГИСТРИРУЮ ТАКСОНОМИЮ, КОТОРОЙ Я ЯВЛЯЮСЬ ПОПЫТКА РАБОТАТЬ С
// CUSTOM TAXONOMY METABOX POSTTYPE - AGE GROUPS
register_taxonomy('theme', array('services'), array(
'hierarchical' => false,
'singular_label' => 'Age Group',
'query_var' => 'theme',
'public' => true,
'show_ui' => true,
'show_tagcloud' => false,
'show_in_nav_menus' => true,
'rewrite' => array( 'slug' => 'age-groups', 'with_front' => false ),
'labels' => array(
'name' => __( 'Age Groups' ),
'singular_name' => __( 'Age Groups' ),
'search_items' => __( 'Search Age Groups' ),
'all_items' => __( 'All Age Groups' ),
'parent_item' => __( 'Parent Age Group' ),
'parent_item_colon' => __( 'Parent Age Group:' ),
'edit_item' => __( 'Edit Age Group' ),
'update_item' => __( 'Update Age Group' ),
'add_new_item' => __( 'Add Age Group' ),
'new_item_name' => __( 'New Name of Age Group' ),
'popular_items' => __( 'Popular Age Groups' ),
'separate_items_with_commas'=> __( 'Separate Age Groups with commas' ),
'add_or_remove_items' => __( 'Add or remove Age Groups' ),
'choose_from_most_used' => __( 'Select Popular Age Groups' ),
),
));
wp_insert_term('Kids', 'theme');
wp_insert_term('Teens', 'theme');
wp_insert_term('Adults', 'theme');
ЭТО ОСТАТОК КОДА, КОТОРЫЙ Я ИСПОЛЬЗУЮ В ФАЙЛЕ ФУНКЦИЙ, И КОД ДЛЯ СОЗДАНИЯ МЕТАБОКСА НА ОСНОВЕ WPALECHEMY. В этой попытке я попытался включить "save_filter" => "wp_set_post_terms($post->идентификатор, "тема")", надеясь, что это сохранит соответствующие данные, но этого не произошло.
// CUSTOM METABOX POSTTYPE - SERVICE DETAILS
$custom_metabox_service_details = new WPAlchemy_MetaBox(array (
'id' => '_service_details-metaboxes', // underscore prefix hides fields from the custom fields area
'title' => 'Age Groups', // title added automatically to the custom metabox
'types' => array('services'), // added only for custom post type "name-of-post-type" can also be "page" or "post"
'context' => 'normal', // same as above, defaults to "normal" but can use "advanced" or "side"
'priority' => 'high', // same as above, defaults to "high" but can use "low" as well
'mode' => WPALCHEMY_MODE_EXTRACT,
'save_filter' => "wp_set_post_terms( $post->ID, 'theme' )",
'template' => TEMPLATEPATH . '/admin-metabox/service_details-metaboxes.php' // contents for the meta box
));
Я ТАКЖЕ ДОЛЖЕН ОТМЕТИТЬ, ЧТО ДИМАС ИЗ WPALECHMEY ТОЛЬКО ЧТО ДОБАВИЛ НОВЫЙ КОД В СВОЮ ВЕРСИЮ GITHUB 1.3.2, КОТОРАЯ ПОЗВОЛЯЕТ ВЫШЕУКАЗАННОМУ КОДУ ВКЛЮЧАТЬ
'save_filter' => "custom-function",
Этот код позволяет вам создать пользовательскую функцию или, я думаю, вызвать пользовательскую функцию, которая выполняется при нажатии кнопки опубликовать, так что, возможно, это лучший способ сохранить данные?
В любом случае, я использую следующий код для пользовательского метабокса для отображения фактического выпадающего списка, отображающего термины таксономии.
<?php
// This function gets called in edit-form-advanced.php
echo '<input type="hidden" name="taxonomy_noncename" id="taxonomy_noncename" value="' . wp_create_nonce( 'taxonomy_theme' ) . '" />';
// Get all theme taxonomy terms
$themes = get_terms('theme', 'hide_empty=0');
?>
<select name='post_theme' id='post_theme'>
// DISPLAY TERMS AS DROP DOWN OPTIONS
<?php $names = wp_get_object_terms($post->ID, 'theme'); ?>
<option class='theme-option' value='' <?php if (!count($names)) echo "selected";?>>None</option>
<?php foreach ($themes as $theme) {
if (!is_wp_error($names) && !empty($names) && !strcmp($theme->slug, $names[0]->slug))
echo "<option class='theme-option' value='" . $theme->slug . "' selected>" . $theme->name . "</option>\n";
else
echo "<option class='theme-option' value='" . $theme->slug . "'>" . $theme->name . "</option>\n";
}
?>
</select>
Я предполагаю, что сохранение данных должно быть простым, как пирог, но, думаю, я путаю себя в том, как это сделать.
Как упомянутый я был бы признателен, если бы вы также могли предоставить предложения по коду, чтобы обеспечить выполнение любых необходимых проверок для обеспечения правильного сохранения данных и только правильно авторизованными людьми.
Должен заранее поблагодарить!
1 answers
Для всех, кому интересно, я ответил на этот вопрос в другом посте: