Пользовательские поля не сохраняются в WordPress 3.0.1

27 окт. 2010 г., 21:49:06
Просмотры: 1.27K
Голосов: 0

У меня это работало пару недель назад, и единственное, что приходит в голову - WordPress обновился и сломал функциональность?

Я следовал этому руководству для добавления пользовательских полей: http://net.tutsplus.com/tutorials/wordpress/rock-solid-wordpress-3-0-themes-using-custom-post-types/

Все работало нормально (я создал около 50 записей с пользовательскими полями), но сегодня, когда я пытаюсь редактировать, изменения в пользовательских полях не сохраняются, хотя другие изменения работают нормально.

Кто-нибудь знает, является ли это известной ошибкой?

Обновление: Вот код, добавленный в functions.php на чистой установке (тема: twentyten)

add_action('init', 'testimonials_register');
add_action("admin_init", "admin_init");
add_action('save_post', 'save_testimonial');

function testimonials_register() {
    $args = array(
        'label' => __('Отзывы'),
        'singular_label' => __('Отзыв'),
        'public' => true,
        'show_ui' => true,
        'capability_type' => 'post',
        'menu_position' => 5,
        'hierarchical' => false,
        'rewrite' => true,
        'supports' => array('title', 'editor', 'thumbnail','custom-fields', 'revisions', 'excerpt', 'page-attributes')
    );

    register_post_type( 'testimonials' , $args );
}

register_taxonomy( 'testimonial_project_type', array("testimonials") , array( 'hierarchical' => true, 'label' => 'Тип проекта', 'query_var' => true, 'rewrite' => true ) );

function admin_init(){
    add_meta_box("testimonialInfo-meta", "Настройки отзыва", "meta_options_testimonial", "testimonials", "advanced", "high");
}

function meta_options_testimonial(){
    global $post;
    $custom = get_post_custom($post->ID);
    $name = $custom["name"][0];
    $position = $custom["position"][0];
    $project_url = $custom["project_url"][0];
    $website = $custom["website"][0];
    ?>
  <label for="name" style="width:90px;display:inline-block">Имя:</label> <input size="50" name="name" id="name" value="<?php echo $name; ?>" /><br>
  <label for="position" style="width:90px;display:inline-block">Должность:</label> <input size="50" name="position" id="position" value="<?php echo $position; ?>" /><br>
  <label for="website" style="width:90px;display:inline-block">Название сайта:</label> <input size="50" name="website" id="website" value="<?php echo $website; ?>" /><br>
  <label for="project_url" style="width:90px;display:inline-block">Slug проекта:</label> <input size="50" name="project_url" id="project_url" value="<?php echo $project_url; ?>" /> <small>Например: 'parker-harris'</small><br>
    <?php
}

function save_testimonial(){
    global $post;
    $custom_meta_fields = array( 'project_url','name','position','website');
    foreach( $custom_meta_fields as $custom_meta_field ):
        if(isset($_POST[$custom_meta_field]) && $_POST[$custom_meta_field] != ""):
            update_post_meta($post->ID, $custom_meta_field, $_POST[$custom_meta_field]);
        endif;
    endforeach;
}

add_filter("manage_edit-testimonials_columns", "testimonials_edit_columns");  
add_action("manage_posts_custom_column",  "testimonials_custom_columns");  

function testimonials_edit_columns($columns){  
    $columns = array(  
        "cb" => "<input type=\"checkbox\" />",  
        "title" => "Заголовок отзыва",  
        "name" => "Имя",  
        "description" => "Краткое описание",  
        "project_url" => "Slug проекта"
    );  
    return $columns;  
}  

function testimonials_custom_columns($column){  
    global $post;  
    switch ($column) {  
        case "name":  
            $custom = get_post_custom();  
            echo $custom["name"][0].", ".$custom["position"][0]."<br> ".$custom["website"][0];
            break;  
        case "description":  
            the_excerpt(); 
            break;  
        case "project_url":  
            $custom = get_post_custom();  
            echo "<a target='_blank' href='/portfolio/".$custom["project_url"][0]."'>".$custom["project_url"][0]."</a>";
            break;  
    }  
}  

// Показывать отзывы в блоге и ленте
add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {
    if ( is_home() && false == $query->query_vars['suppress_filters']  || is_feed() )
        $query->set( 'post_type', array( 'post', 'testimonials') );
    return $query;
}
2
Комментарии

Кстати, это НЕ та проблема с сохранением, которая возникает в тех обучающих материалах (когда автосохранение затирает данные), так как я это исправил, и сейчас данные вообще не сохраняются, а не только по таймеру. Но всё работало полностью исправно всего несколько недель назад!

Shaun Shaun
27 окт. 2010 г. 23:01:25

Мои пользовательские типы записей работают отлично. Вместо ссылки на обучающий материал, пожалуйста, предоставьте ссылку на ваш код на таких сервисах, как pastie.org или http://gist.github.com/, тогда мы сможем изучить ваш код.

curtismchale curtismchale
28 окт. 2010 г. 01:57:32
Все ответы на вопрос 1
1

Я поместил ваш код в плагин и внес два изменения, чтобы он заработал:

  • В save_testimonial() вы используете $post, но не объявляете его как глобальную переменную. Поэтому $post->ID будет пустым, и update_post_meta() не будет знать, что сохранять. Добавьте global $post; в начале функции.
  • register_taxonomy() отсутствует в вашем обработчике init и, вероятно, вызывается слишком рано (если это плагин, возможно, вам повезло, когда вы делали это в functions.php). Перенесите его в функцию testimonals_register().

У вас был включен WP_DEBUG со значением TRUE при отладке? В таком случае вы должны были получить предупреждения, которые привели меня к этому решению.

28 окт. 2010 г. 11:31:00
Комментарии

Спасибо, это сработало! Должно быть, это было удалено из кода как-то... :)

Shaun Shaun
28 окт. 2010 г. 11:44:58