web-dev-qa-db-fra.com

Options du plug-in non enregistrées dans la base de données WP 4,5

WordPress 4.5 a cassé mon plugin et il n'y a aucune indication évidente pourquoi dans le journal des modifications

Le plugin contrôle la visibilité des éléments de menu. Les utilisateurs sélectionnent un ou plusieurs pays et affichent ou non l'élément de menu.

Le réglage pour afficher ou masquer fonctionne toujours:

add_action( 'wp_update_nav_menu_item', array( $this, 'csmi_update_visibility' ), 10, 3 );
...
<input
type="radio"
id="edit-menu-item-visibility-<?php echo $item_id;?>"
name="menu-item-show-hide[<?php echo $item_id; ?>]" 
value="hide" <?php checked( get_post_meta( $item_id, 'hide_show', true ), 'hide', true ); ?>
/>Hide from these countries.</br>
<input
type="radio"
id="edit-menu-item-visibility-<?php echo $item_id; ?>"
name="menu-item-show-hide[<?php echo $item_id; ?>]"
value="show" <?php checked( get_post_meta( $item_id, 'hide_show', true ), 'show', true ); ?>
/>Only show to these countries.</br>
...
/* Put visibility settings in the database. */
function csmi_update_visibility( $menu_id, $menu_item_db_id, $args ) {
    $meta_value = get_post_meta( $menu_item_db_id, 'hide_show', true );
    if ( isset( $_POST[ 'menu-item-show-hide' ][ $menu_item_db_id ] ) ) {
        $new_meta_value = $_POST[ 'menu-item-show-hide' ][ $menu_item_db_id ];
    }
    if ( $meta_value !== $new_meta_value ) {
        update_post_meta( $menu_item_db_id, 'hide_show', $new_meta_value );
    }
}

Mais les lieux ne sont pas sauvegardés:

add_action( 'wp_update_nav_menu_item', array( $this, 'csmi_update_locations' ), 10, 3 );
...
<select name="menu-item-visibility[<?php echo $item_id; ?>][]" id="edit-menu-item-visibility-<?php echo $item_id; ?>" class="chzn-select" multiple="true">
<?php
$vals = get_post_meta( $item_id, 'locations', true );
foreach( $countries as $key => $value ) { 
?>
    <option value="<?php echo $key;?>"<?php echo is_array( $vals ) && in_array( $key, $vals ) ? "selected='selected'" : ''; ?>> <?php echo $value;?> </option>
<?php
}
?>
</select>
...
/* Put locations in the database. */
function csmi_update_locations( $menu_id, $menu_item_db_id, $args ) {
    $meta_value = get_post_meta( $menu_item_db_id, 'locations', true );
    if ( isset( $_POST[ 'menu-item-visibility' ][ $menu_item_db_id ] ) ) { 
        $new_meta_value = $_POST[ 'menu-item-visibility' ][ $menu_item_db_id ];
    }
    if ( !isset($new_meta_value ) ) {
        delete_post_meta( $menu_item_db_id, 'locations', $meta_value );
    }
    elseif ( $meta_value !== $new_meta_value ) {
        update_post_meta( $menu_item_db_id, 'locations', $new_meta_value );
    }
}

Des idées comment WP 4.5 aurait pu le casser? Je suis à la fin de mon esprit.

Le code source est disponible ici: https://plugins.trac.wordpress.org/browser/location-specific-menu-items-by-country/tags/1.0.3

1
j8d

C'est probablement la cause principale - https://core.trac.wordpress.org/changeset/36510 . Core est passé de l'enregistrement des menus dans $_POST à l'envoi de ceux-ci au format JSON codé, puis décodé en $_POST. Je ne connais pas très bien la manière dont les menus sont envoyés au serveur, mais vous utilisez probablement soit le mauvais crochet, soit le bon crochet, mais trop tôt, ou il y a un bug dans le noyau.

1
Mark Kaplun