Câmpurile personalizate nu se salvează în WordPress 3.0.1 - Soluții și remedieri

27 oct. 2010, 21:49:06
Vizualizări: 1.27K
Voturi: 0

Această funcționalitate funcționa acum câteva săptămâni și singurul lucru la care mă pot gândi este că WordPress s-a actualizat și a stricat funcționalitatea?

Am urmat tutorialul de aici pentru a adăuga câmpuri personalizate: http://net.tutsplus.com/tutorials/wordpress/rock-solid-wordpress-3-0-themes-using-custom-post-types/

Funcționa perfect (am introdus aproximativ 50 de postări personalizate, toate cu câmpuri personalizate), dar când încerc să le editez astăzi, modificările pe care le fac la câmpurile personalizate nu se salvează, deși alte modificări funcționează normal.

Știe cineva dacă acesta este un bug cunoscut?

Edit: Iată codul, adăugat în functions.php pe o instalare nouă (temă: twentyten)

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

function testimonials_register() {
    $args = array(
        'label' => __('Testimoniale'),
        'singular_label' => __('Testimonial'),
        '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' => 'Tip Proiect', 'query_var' => true, 'rewrite' => true ) );

function admin_init(){
    add_meta_box("testimonialInfo-meta", "Opțiuni Testimonial", "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">Nume:</label> <input size="50" name="name" id="name" value="<?php echo $name; ?>" /><br>
    <label for="position" style="width:90px;display:inline-block">Poziție:</label> <input size="50" name="position" id="position" value="<?php echo $position; ?>" /><br>
    <label for="website" style="width:90px;display:inline-block">Nume Website:</label> <input size="50" name="website" id="website" value="<?php echo $website; ?>" /><br>
    <label for="project_url" style="width:90px;display:inline-block">Slug Proiect:</label> <input size="50" name="project_url" id="project_url" value="<?php echo $project_url; ?>" /> <small>Ex. '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" => "Titlu Testimonial",  
        "name" => "Nume",  
        "description" => "Extras",  
        "project_url" => "Slug Proiect"
    );  
    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;  
    }  
}  

// Aceasta afișează testimonialele în blog și feed
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
Comentarii

Apropo, aceasta NU este cealaltă problemă de salvare care a apărut din acele tutoriale (Autosaving care șterge datele), deoarece am rezolvat-o și aceasta nu salvează deloc, nu doar la un interval de timp. Dar funcționa perfect acum doar câteva săptămâni!

Shaun Shaun
27 oct. 2010 23:01:25

Tipurile mele personalizate de postări funcționează perfect. În loc să ne redirecționați către tutorial, vă rugăm să furnizați un link către codul dvs. pe un site precum pastie.org sau http://gist.github.com/, astfel încât să putem analiza codul dvs.

curtismchale curtismchale
28 oct. 2010 01:57:32
Toate răspunsurile la întrebare 1
1

Am pus codul tău într-un plugin și a trebuit să modific două lucruri pentru a-l face să funcționeze:

  • În save_testimonial(), folosești $post dar nu l-ai declarat ca global. Deci $post->ID va fi gol, iar update_post_meta() nu știe ce să salveze. Adaugă global $post; la începutul funcției.
  • register_taxonomy() nu se află în handler-ul tău init și este probabil apelat prea devreme (dacă este un plugin, poate ai avut noroc când ai făcut asta în functions.php). Mută-l în funcția testimonals_register().

Aveai WP_DEBUG setat la TRUE când debug-ui? Atunci ar fi trebuit să primești avertismentele care m-au condus la această soluție.

28 oct. 2010 11:31:00
Comentarii

Mulțumesc, a funcționat! Trebuie să fi fost eliminat din cod cumva... :)

Shaun Shaun
28 oct. 2010 11:44:58