如何使用Metabox复选框在数组中添加页面ID?

时间:2016-08-23 02:10:16

标签: php wordpress meta-boxes

我想要做的是双语网站。 WordPress不支持这种特殊语言Papiamento。因此,客户必须创建两个单独的页面,英语和Pap。我所做的就是为它编写代码来为每个页面显示英文或Pap菜单。

像这样,在header.php中:

<?php

    if( is_page( array('salon-and-spa-pap', 'tocante-nos', 'testimonio', 'tuma-contacto-cu-nos', 'galeria', 'tratamentonan-di-masahe', 'tratamentonan-spa-di-curpa', 'servicionan-di-boda', 'tratamentonan-spa-di-cara', 'wowo-lip-nek', 'cuido-di-man', 'tratamento-di-huna', 'tratamento-di-huna-di-pia', 'cuido-di-pia', 'salon-p', 'spa-etiquette-pap', 'wax-p', 'reserva-un-tratamento')) ) {
        wp_nav_menu(array( 'theme_location' => 'menu_top_pap' ) );
    } else {
        wp_nav_menu(array( 'theme_location' => 'secondary-menu' ) );
    }

?>

然而,问题是客户端必须继续回到header.php以在每次创建新页面时添加另一个页面slug。因此,我为此创建了一个Metabox插件。我创建了一个Metabox复选框,以便每次页面都用于Papiamento语言时,客户端只需选中该框,页面ID或slug将添加到上面的代码中。

我发现了另一个问题(https://wordpress.stackexchange.com/questions/71043/listing-pages-with-checkboxes-in-a-metabox-and-saving-them)可能与我想要的问题类似,但它对我不起作用。

这是我的元文件功能基于这篇文章(http://themefoundation.com/wordpress-meta-boxes-guide/)。

<?php
function prfx_custom_meta() {
    add_meta_box( 'prfx_meta', __( 'Papiamento Page Box', 'prfx-textdomain' ), 'prfx_meta_callback', 'page', 'normal', 'low' );
}
add_action( 'add_meta_boxes', 'prfx_custom_meta' );

function prfx_meta_callback( $post ) {
    wp_nonce_field( basename( __FILE__ ), 'prfx_nonce' );
    $prfx_stored_meta = get_post_meta( $post->ID );
    $checkfield = maybe_unserialize( get_post_meta($post->ID, "checkfield", true) );
    ?>


    <p>
    <span class="prfx-row-title"><?php _e( 'Pap Checkbox', 'prfx-textdomain' )?></span>
    <div class="prfx-row-content">
        <label for="meta-checkbox">
            <input type="checkbox" name="checkfield[]" id="page_<?php echo $page->ID; ?>" value="<?php echo $page->ID; ?>" <?php if ( in_array($page->ID, (array) $checkfield) ) { ?> checked <?php } ?>/> <label for="page_<?php echo $page->ID; ?>"><?php echo $page->post_title; ?>
            <?php _e( 'Check if this page is Papiamento', 'prfx-textdomain' )?>
        </label>
    </div>
</p>
    <?php
}

/**
 * Saves the custom meta input
 */
function prfx_meta_save( $post_id ) {

    // Checks save status
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'prfx_nonce' ] ) && wp_verify_nonce( $_POST[ 'prfx_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

    // Exits script depending on save status
    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
        return;
    }

// Checks for input and sanitizes/saves if needed

    // Checks for input and saves
    if( isset( $_POST[ 'checkfield' ] ) ) {
        update_post_meta($post_id, "checkfield", $_POST['checkfield'] );
    } 

}
add_action( 'save_post', 'prfx_meta_save' );

并在header.php中调用页面ID,如下所示:

<?php

    if( in_array($page->ID, (array) $checkfield) ) {
        wp_nav_menu(array( 'theme_location' => 'menu_top_pap' ) );
    } else {
        wp_nav_menu(array( 'theme_location' => 'secondary-menu' ) );
    }

?>

但它没有用。请帮忙!

*****************更新***************** 我一直在尝试编辑函数prfx_meta_callback($ post),但没有成功。这是我正在尝试修改的最新代码...

function prfx_meta_callback( $post ) {
    wp_nonce_field( basename( __FILE__ ), 'prfx_nonce' );
    $checkfield = maybe_unserialize( get_post_meta($post->ID, "checkfield", true) );

    $page = get_pages(); 
    $prfx_stored_meta = get_post_meta( $post->ID );

    ?>

    <p>
    <span class="prfx-row-title"><?php _e( 'Pap Checkbox', 'prfx-textdomain' )?></span>
    <div class="prfx-row-content">

       <label for="page_<?php echo $page->ID; ?>">

        <input id="page_<?php echo $page->ID; ?>" type="checkbox" name="checkfield[]" value="<?php echo $page->ID; ?>" <?php if ( isset($checkfield [ ?>'<?php echo $page->ID; ?>'<?php ] ) ) checked( $checkfield[ ?>'<?php echo $page->ID; ?>'<?php ][0], '<?php echo $page->ID; ?>'); ?>/>    <?php _e( 'Check if this page is Papiamento', 'prfx-textdomain' )?></label> <br>

    </div>
</p>

 <?php 

我一直试图让它像那样,如果Pap,然后检查,但如果不是Pap,在每一页都没有检查。

1 个答案:

答案 0 :(得分:0)

如果元数据库正确保存了复选框设置,您可以使用以下代码进行header.php检查:

if ( in_array( get_the_ID(), get_post_meta( get_the_ID(), 'checkfield', true ) ) ) {
    wp_nav_menu(array( 'theme_location' => 'menu_top_pap' ) );
} else {
    wp_nav_menu(array( 'theme_location' => 'secondary-menu' ) );
}