Câmpurile personalizate nu se salvează în WordPress 3.0.1 - Soluții și remedieri
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;
}

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, iarupdate_post_meta()
nu știe ce să salveze. Adaugăglobal $post;
la începutul funcției. register_taxonomy()
nu se află în handler-ul tăuinit
și este probabil apelat prea devreme (dacă este un plugin, poate ai avut noroc când ai făcut asta înfunctions.php
). Mută-l în funcțiatestimonals_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.
