J'ai rencontré un problème qui me laisse perplexe: après la mise à niveau vers WP 3.6, mes champs de métabox pouvant être triés ne sauvegardent pas leur position lorsque vous les réordonnez. Ci-dessous mon code:
PHP:
function save_box( $post_id ) {
$post_type = get_post_type();
// verify nonce
if ( ! isset( $_POST['custom_meta_box_nonce_field'] ) )
return $post_id;
if ( ! ( in_array( $post_type, $this->page ) || wp_verify_nonce( $_POST['custom_meta_box_nonce_field'], 'custom_meta_box_nonce_action' ) ) )
return $post_id;
// check autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// check permissions
if ( ! current_user_can( 'edit_page', $post_id ) )
return $post_id;
// loop through fields and save the data
foreach ( $this->fields as $field ) {
if( $field['type'] == 'section' ) {
$sanitizer = null;
continue;
}
if( in_array( $field['type'], array( 'tax_select', 'tax_checkboxes' ) ) ) {
// save taxonomies
if ( isset( $_POST[$field['id']] ) ) {
$term = $_POST[$field['id']];
wp_set_object_terms( $post_id, $term, $field['id'] );
}
}
else {
// save the rest
$old = get_post_meta( $post_id, $field['id'], $field['type'], true );
if ( isset( $_POST[$field['id']] ) )
$new = $_POST[$field['id']];
if ( isset( $new ) && $new != $old ) {
$sanitizer = isset( $field['sanitizer'] ) ? $field['sanitizer'] : 'sanitize_text_field';
if ( is_array( $new ) )
$new = meta_box_array_map_r( 'meta_box_sanitize', $new, $sanitizer );
else
$new = meta_box_sanitize( $new, $sanitizer );
update_post_meta( $post_id, $field['id'], $new );
} elseif ( isset( $new ) && '' == $new && $old ) {
delete_post_meta( $post_id, $field['id'], $old );
}
}
} // end foreach
}
jQuery:
$('.meta_box_repeatable tbody').sortable({
opacity: 0.6,
revert: true,
cursor: 'move',
handle: '.hndle'
});
// post_drop_sort
$('.sort_list').sortable({
connectWith: '.sort_list',
opacity: 0.6,
revert: true,
cursor: 'move',
cancel: '.post_drop_sort_area_name',
items: 'li:not(.post_drop_sort_area_name)',
update: function(event, ui) {
var result = $(this).sortable('toArray');
var thisID = $(this).attr('id');
$('.store-' + thisID).val(result)
}
});
$('.sort_list').disableSelection();
Ce que j'ai est une metabox qui contient une boîte répétable, à l'intérieur de celle-ci se trouve un bouton de téléchargement d'image et une entrée de texte de légende. Tout fonctionne bien, je peux ajouter plus de répétables et les trier, mais lorsque je sauvegarde le post, les répétables reprennent leur position d'origine.
Si quelqu'un veut, je peux vous donner les détails de connexion pour voir la version en direct.
Toute aide serait grandement appréciée.
Normalement, il devrait suffire de simplement mettre en file d'attente le script postsbox
sur une page où vous souhaitez créer des boîtes de méta triables.
Faites simplement ce qui suit:
add_action( 'admin_enqueue_scripts', 'wpse112022_postbox_enqueue' );
function wpse112022_postbox_enqueue( $hook_suffix )
{
// uncomment the next line to see what the $hook_suffix of your desired page is
# var_dump( $hook_suffix );
if ( 'hook_suffix of desired page' !== $hook_suffix )
return;
wp_enqueue_script( 'postbox' );
// If the last line didn't enqueue the script, then uncomment the following instead:
/*
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
wp_enqueue_script(
'postbox',
"/wp-admin/js/postbox{$suffix}.js",
array( 'jquery-ui-sortable' ),
false
true
);
*/
}