it-swarm.xyz

Пользовательский метабокс с раскрывающимся списком таксономии - проблема сохранения

Моя цель была проста - создать собственный тип записи с настраиваемым метабоксом с простым выпадающим списком терминов таксономии вместо использования тегов или флажков. Причина заключалась в том, чтобы редактор мог выбрать только один термин из списка таксономии.

После проб и ошибок мне наконец-то удалось найти способ использовать превосходные инструменты создания метабоксов, которые я использую из WP-Alchemy (http://farinspace.com/wpalchemy-metabox/), чтобы создать метабокс и отобразить на нем применимые условия в раскрывающемся списке.

У меня проблема в том, что я не могу получить новый выбор из выпадающего меню, чтобы сохранить выбранное значение.

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

Как уже упоминалось, в настоящее время он отображает список терминов в раскрывающемся списке, а также правильно отображает любой термин, который может быть связан.

Просто сохранение новых значений - вот где у меня возникают проблемы.

Из обширных исследований "кажется", что решение состоит в использовании WordPress "wp_set_post_terms" функции, которая более подробно объясняется здесь: http://codex.wordpress.org/Function_Reference/wp_set_post_terms Однако я не уверен, как правильно его использовать чтобы достичь желаемого результата.

Ниже я приведу код, который я использую. Очень возможно, что есть лучший способ сделать это, и я был бы признателен за любые предложения, которые вы, ребята, могли бы также сделать, чтобы были выполнены соответствующие "проверки", чтобы гарантировать, что данные не могут быть вставлены пользователями, которые не авторизованы.

ФАЙЛ FUNCTIONS.PHP (ПОКАЗЫВАЕТ СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО POST ТИПА И ТАКСОНОМИИ НИЖЕ.

//////////////////////////////////////////////////////////////////////////////
// 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
   )
 ));
}

ЗДЕСЬ IS Где я регистрирую таксономию, с которой я пытаюсь работать

// 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');

НАСТОЯЩЕЕ IS ОСТАВЛЕНИЕ КОДЕКСА, КОТОРЫЙ Я ИСПОЛЬЗУЮ В ФАЙЛЕ ФУНКЦИЙ И КОДЕКСА ДЛЯ СОЗДАНИЯ METABOX НА ОСНОВЕ WPALECHEMY. В этой попытке я попытался включить 'save_filter' => "wp_set_post_terms ($ post-> ID, 'theme')", надеясь, что это сохранит применимые данные, но этого не произошло.

// 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
    ));

Я ДОЛЖЕН ТАКЖЕ ОТМЕТЬТЕ, ЧТО ДИМАС БОЛЕЕ AT WPALECHMEY ТОЛЬКО ДОБАВИЛ НЕКОТОРЫЙ НОВЫЙ КОД В ЕГО 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>

Я предполагаю, что сохранение данных должно быть простым как пирог, но я предполагаю, что я путаюсь с тем, как достигнуть этого.

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

Должен заранее спасибо!

3
NetConstructor.com

Для тех, кто заинтересован, я ответил на этот вопрос в другом посте:

Сохранение условий таксономии

1
NetConstructor.com