netconstructorcom
  • 0
Мастер

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

  • 0

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

После проб и ошибок мне, наконец, удалось найти способ использовать отличные инструменты для создания метабоксов, которые я использую от 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');

ЭТО ОСТАЛОСЬ КОДА, КОТОРЫЙ Я ИСПОЛЬЗУЮ В ФАЙЛЕ ФУНКЦИЙ, И КОД ДЛЯ СОЗДАНИЯ 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
    ));

Я ДОЛЖЕН ТАКЖЕ ОБРАТИТЬ ВНИМАНИЕ, ЧТО ДИМАС НА WPALECHMEY ТОЛЬКО ДОБАВИЛ НЕКОТОРЫЙ НОВЫЙ КОД В СВОЮ ВЕРСИЮ 1.3.2 GITHUB, КОТОРЫЙ ПОЗВОЛЯЕТ ВЫШЕУКАЗАННОМУ КОДУ ВКЛЮЧАТЬ

'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>

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

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

Заранее спасибо!

Share
  1. Кому интересно, я ответил на этот вопрос в другом посте:

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

    • 0

Оставить ответ

You must login to add an answer.