保存Metabox内容无效

时间:2018-05-21 作者:DRZN93

我正在尝试保存一个metabox输入,但它似乎不起作用。我使用的是数组(因为我需要我的metabox有60行),所以我假设问题就出在数组中。

这是我为管理员提供的metabox函数(它可以正确显示我要显示的信息):

function mock_metabox() {
    global $post;
    // Nonce field
    wp_nonce_field( basename( __FILE__ ), \'mock_fields\' );
    // init counter for meta array
    $contadorglobal = 1;
    $selecciones = array();
    $equipos = array();
    $equiposog = array();
    while ( $contadorglobal <= 60 ){
        $selecciones[$contadorglobal-1] = get_post_meta( $post->ID, \'_seleccion_\' . $contadorglobal, true );
        $equipos[$contadorglobal-1] = get_post_meta( $post->ID, \'_equipo_\' . $contadorglobal, true );
        $equiposog[$contadorglobal-1] = get_post_meta( $post->ID, \'_equipoog_\' . $contadorglobal, true );
        $contadorglobal++;
    }

    // Output the fields
    ?>
    <h3> Informacion del Mock </h3>
    <table>
    <tr>
    <th> # </th>
    <th> Jugador </th>
    <th> Equipo </th>
    <th> Equipo Original </th>
    </tr>

    <?

    $contador = 1;

    $teams = get_posts( array(
            \'post_type\' => \'team\',
            \'orderby\'   => \'title\',
            \'order\'     => \'ASC\',
            \'numberposts\' => -1,
            \'post_status\' => \'publish\'
        ) );

    while ( $contador <= 60 ){
        ?>
        <tr>
            <td><?php echo $contador ?></td>
            <td><input type="text" name="<? \'jugador_\' . $contador ?>" value="<?php echo $selecciones[$contador-1] ; ?>" />
            <td><select name="<? \'equipo_\' . $contador?>" ><?
            foreach ( $teams as $team ) { ?>
                <option value="<?php echo $team->ID; ?>" <?php checked( $equipos[$contador-1], $team->ID ); ?> > <?php echo $team->post_title; ?> </option> <? } ?> </select> </td>
            <td><select name="<? \'equipoog_\' . $contador ?>" ><?
            foreach ( $teams as $team ) { ?>
                <option value="<?php echo $team->ID; ?>" <?php checked( $equiposog[$contador-1], $team->ID ); ?>  > <?php echo $team->post_title; ?> </option> <? } ?> </select> </td>
            <? $contador++; ?>
        </tr>
        <?php } ?>
    </table>


<?}
这就是保存功能(我原以为问题出在while上,但我尝试删除它,它也不保存任何信息)。

function mock_save_meta_box_data( $post_id ){
    // verify taxonomies meta box nonce
    if ( !isset( $_POST[\'mock_fields\'] ) || !wp_verify_nonce( $_POST[\'mock_fields\'], basename( __FILE__ ) ) ){
        return;
    }
    // return if autosave
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ){
        return;
    }
    // Check the user\'s permissions.
    if ( ! current_user_can( \'edit_post\', $post_id ) ){
        return;
    }
    // guarda tipo traspaso
    $contadorid = 1;
    if ( isset( $_REQUEST[\'jugador_\' . $contadorid] ) ) {
        update_post_meta( $post_id, \'_seleccion_\' . $contadorid, $_POST[\'jugador_\' . $contadorid] );
        }
    if ( isset( $_REQUEST[\'equipo_\' . $contadorid] ) ) {
        update_post_meta( $post_id, \'_equipo_\' . $contadorid, $_POST[\'equipo_\' . $contadorid] );
        }
    if ( isset( $_REQUEST[\'equipoog_\' . $contadorid] ) ) {
        update_post_meta( $post_id, \'_equipoog_\' . $contadorid, $_POST[\'equipoog_\' . $contadorid] );
        }
    }

add_action( \'save_post_mock\', \'mock_save_meta_box_data\' );
有什么想法吗?提前感谢!

1 个回复
最合适的回答,由SO网友:Sohan Zaman 整理而成

主要问题是您没有回显字段的名称。喜欢<input type="text" name="<? \'jugador_\' . $contador ?>" 应该是<input type="text" name="<? echo \'jugador_\' . $contador ?>"

不过,我有一个更好的建议。您可以在表单提交中使用数组。因此,您的metabox回调函数应该如下所示:

function mock_metabox() {
    global $post;
    // Nonce field
    wp_nonce_field( basename( __FILE__ ), \'mock_fields\' );
    // init counter for meta array
    $selecciones = get_post_meta( $post->ID, \'_seleccion\', true );
    $equipos = get_post_meta( $post->ID, \'_equipo\', true );
    $equiposog = get_post_meta( $post->ID, \'_equipoog\', true );

    // Output the fields
    ?>
    <h3> Informacion del Mock </h3>
    <table>
    <tr>
    <th> # </th>
    <th> Jugador </th>
    <th> Equipo </th>
    <th> Equipo Original </th>
    </tr>

    <?

    $contador = 1;

    $teams = get_posts( array(
            \'post_type\' => \'team\',
            \'orderby\'   => \'title\',
            \'order\'  => \'ASC\',
            \'numberposts\' => -1,
            \'post_status\' => \'publish\'
        ) );

    while ( $contador <= 60 ){
        $v_jugador = isset( $selecciones[$contador-1] ) ? $selecciones[$contador-1] : \'\';
        $v_equipo = isset( $equipos[$contador-1] ) ? $equipos[$contador-1] : \'\';
        $v_equiposog = isset( $equiposog[$contador-1] ) ? $equiposog[$contador-1] : \'\';
        ?>
        <tr>
            <td><?php echo $contador ?></td>
            <td><input type="text" name="jugador[]" value="<?php echo $v_jugador; ?>" />
            <td><select name="equipo[]"><?
            foreach ( $teams as $team ) { ?>
                <option value="<?php echo $team->ID; ?>" <?php selected( $v_equipo, $team->ID ); ?> > <?php echo $team->post_title; ?> </option> <? } ?> </select> </td>
            <td><select name="equipoog[]"><?
            foreach ( $teams as $team ) { ?>
                <option value="<?php echo $team->ID; ?>" <?php selected( $v_equiposog, $team->ID ); ?>  > <?php echo $team->post_title; ?> </option> <? } ?> </select> </td>
            <? $contador++; ?>
        </tr>
        <?php } ?>
    </table>
    <?
}
以及对此的更新功能:

function mock_save_meta_box_data( $post_id ){
    // verify taxonomies meta box nonce
    if ( !isset( $_POST[\'mock_fields\'] ) || !wp_verify_nonce( $_POST[\'mock_fields\'], basename( __FILE__ ) ) ){
        return;
    }
    // return if autosave
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ){
        return;
    }
    // Check the user\'s permissions.
    if ( ! current_user_can( \'edit_post\', $post_id ) ){
        return;
    }
    // guarda tipo traspaso
    if ( isset( $_POST[\'jugador\'] ) ) {
        update_post_meta( $post_id, \'_seleccion\', $_POST[\'jugador\'] );
    }
    if ( isset( $_POST[\'jugador\'] ) ) {
        update_post_meta( $post_id, \'_equipo\', $_POST[\'equipo\'] );
    }
    if ( isset( $_POST[\'jugador\'] ) ) {
        update_post_meta( $post_id, \'_equipoog\', $_POST[\'equipoog\'] );
}

add_action( \'save_post_mock\', \'mock_save_meta_box_data\' );
试试看。

编辑:不使用checked() 在选择字段的选项中。使用selected() 作用

结束

相关推荐

在Metabox中将复选框设为默认选中

好吧,我又来了。。哈哈,对不起。是的,我到处都在寻找答案,但是我使用的代码不同,我无法理解它。所以我从GenerateWP.com 我再次请求帮助,但始终没有得到答复。这是:class TP_Primo_Featured_Image_Options_Custom_Meta_Box { public function __construct() { if ( is_admin() ) { add_action(\'load-post.p