web-dev-qa-db-ja.com

プラグインオプションがデータベースに保存されない WP 4.5

WordPress 4.5が私のプラグインを壊しました、そしてなぜ 変更ログ に明白な手がかりがありません

プラグインはメニュー項目の可視性を制御します。ユーザーは1つ以上の国を選択し、メニュー項目を表示するか隠すかを選択します。

表示または非表示の設定は引き続き機能します。

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 );
    }
}

しかし、場所は保存されていません。

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 );
    }
}

どのようにWP 4.5が壊れたかもしれないという考えはありますか?私は私の知恵の終わりに来ました。

ここで入手可能なソースコード: https://plugins.trac.wordpress.org/browser/location-specific-menu-items-by-country/tags/1.0.3

1
j8d

これがおそらく根本的な原因です - https://core.trac.wordpress.org/changeset/36510 。 Coreはメニューを$_POSTで保存することからjsonでエンコードしてそれを$_POSTにデコードすることに移行しました。私はメニューがサーバにどのように送られるかについてあまりよく知らないが、あなたはおそらく間違ったフックを使うか、正しいフックを使うが早すぎるか、あるいはコアにバグがあるかのどちらかである。

1
Mark Kaplun