元框 Wordpress 中的多个复选框

Multiple checkbox in metabox Wordpress

提问人:Nikita Pelevin 提问时间:6/8/2023 更新时间:6/8/2023 访问量:45

问:

我在帖子管理面板中制作了多个复选框。当用户创建帖子并选中必要的复选框时,它会将其存储以输出到帖子页面中。 我用于创建和保存复选框的代码。

function expertise_checkbox_meta_box_callback( $post, $meta ){
    $screens = $meta['args']; 
    wp_nonce_field( plugin_basename(__FILE__), 'expertise_checkbox_field_noncename' );
    $value = maybe_unserialize(get_post_meta( $post->ID, 'expertise_checkbox_elements', true ));
    //"id" => "value"
    $expertise_checkbox_elements = array(
        'design_research'  => pll__('Design research'),
        'product_design' => pll__('Product design'),
        '3d_modelling' => pll__('3D modelling'),
        'engineering' => pll__('Engineering'),
        'dfm' => pll__('Design for manufacturing'),
        'prototyping' => pll__('Prototyping'),
        'production' => pll__('Production')
    );
    foreach ( $expertise_checkbox_elements as $id => $element ) {
        // If the value for checkboxes exist and 
        // this element is part of saved meta check it.
        if ( is_array( $value ) && in_array( $id, $value ) ) {
            $checked = 'checked="checked"';
        } else {
            $checked = null;
        }
        ?>
        <p>
            <input type="checkbox" name="multval[]" value="<?php echo $id;?>" <?php echo $checked; ?> />
            <?php echo $element;?>
            <br>
        </p>
        <?php
    }
}
##Save
add_action( 'save_post', 'client_company_save_postdata' );
function client_company_save_postdata( $post_id ) {
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'expertise_checkbox_field_noncename' ] ) && wp_verify_nonce( $_POST[ 'expertise_checkbox_field_noncename' ], basename( __FILE__ ) ) ) ? 'true' : 'false';
    if ( $is_revision || !$is_valid_nonce )
        return; 
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return;
    if( ! current_user_can( 'edit_post', $post_id ) )
        return;
    if ( ! empty( $_POST['multval'] ) ) {
        update_post_meta( $post_id, 'expertise_checkbox_elements', $_POST['multval'] );
    // Otherwise just delete it if its blank value.
    } else {
        delete_post_meta( $post_id, 'expertise_checkbox_elements' );
    }
}

这段代码起作用了(它是保存复选框状态并更新它)。但是当我在帖子页面上输出复选框值数组时,我看到的不是“设计研究”,而是“制造设计”等。 输出值的代码。design_researchdfm

<?php 
$expertise_elements = (get_post_meta( $post->ID, 'expertise_checkbox_elements', true )); 
foreach ($expertise_elements as $element) {
   echo ('<li>'.$element.'</li>');
}
?>

我看到我存储了数组中的“键”,而不是值。但我不明白如何使这段代码从数组输出“值”。

php wordpress 自定义字段 元框

评论


答:

1赞 Caleb 6/8/2023 #1

请参阅我在此处提供的答案:https://wordpress.stackexchange.com/questions/416533/get-custom-field-label-select-dropdown-on-front-end/416534#416534

您可以将数组的键设置为用户友好,但更合适的方法是在函数中定义选项数组,然后在后端和前端使用该函数。

评论

0赞 Nikita Pelevin 6/9/2023
谢谢!这段代码对我有用!
1赞 GeorgeP 6/8/2023 #2

只需使用您最初拥有的相同数组作为名称的映射即可。 像这样的东西:

$names = array(
  'design_research'  => __('Design research'),
  'product_design' => __('Product design'),
  '3d_modelling' => __('3D modelling'),
  'engineering' => __('Engineering'),
  'dfm' => __('Design for manufacturing'),
  'prototyping' => __('Prototyping'),
  'production' => __('Production')
);
$expertise_elements = (get_post_meta($post->ID, 'expertise_checkbox_elements', true));
foreach ($expertise_elements as $el) {
  echo ('<li>' . $names[$el] . '</li>');
}

根据代码的其余部分,为了不重复自己,您可以将该数组作为类变量、函数或用户提供的值/名称列表。

评论

0赞 Nikita Pelevin 6/9/2023
谢谢!你的代码也起作用了。但是 Caleb 的解决方案更适合我,因为我只需要在一个地方编辑数组。
1赞 GeorgeP 6/9/2023
@NikitaPelevin这就是我在上面的评论中所说的,根据你的其余代码,你不应该 DRY,我建议一个函数、一个类变量或其他方法 - en.wikipedia.org/wiki/Don%27t_repeat_yourself