在Wordpress中保存来自多个复选框元框的数据
问题描述:
我正在学习如何向帖子添加元框。我想创建一组带有文本输入和多个checbox的metabox。现在,复选框就像这样放在那里,但最终它们将通过带有来自其他地方的内容的foreach循环生成,所以对于我给它们的名称如条目[0],条目[1]等是很重要的。他们必须通过循环来保存,因为我不知道会产生多少。在Wordpress中保存来自多个复选框元框的数据
这是我到目前为止有:
// adding the metaboxes
function add_post_reference() {
add_meta_box('post-reference', 'Reference', 'referenceCallBack', 'languagecourses', 'side', 'high');
}
add_action('add_meta_boxes', 'add_post_reference');
// callback function
function referenceCallBack($post) {
wp_nonce_field('reference_meta_box', 'reference_nonce');
$name_value = get_post_meta($post->ID, '_post_reference_name', true);
$link_value = get_post_meta($post->ID, '_post_reference_link', true);
试图做上面一样与我的复选框,但我不知道要放什么东西有:
$teachers_value = get_post_meta($post->ID, 'what do I put here?', true); // what do I put here?
呼应HTML结构现在(文本输入工作(值得到保存),我想弄清楚如何使复选框保存以及:
echo '<label for="reference-name">'. 'Reference Name' .'</label>';
echo '<input type="text" id="reference-name" name="post_reference_name" placeholder="Example" value="'.$name_value.'" size="25"/>';
echo '<p class="howto">'. 'Add the name of the reference' .'</p>';
echo '<label for="reference-link">'. 'Reference Link' .'</label>';
echo '<input type="text" id="reference-link" name="post_reference_link" placeholder="http://www.example.com/" value="'.$link_value.'" size="25"/>';
echo '<p class="howto">'. 'Add the link of the reference' .'</p>';
// my checkboxes
echo '<input type="checkbox" name="entry[0]" value="moredata">';
echo '<input type="checkbox" name="entry[1]" value="moredata">';
echo '<input type="checkbox" name="entry[2]" value="moredata">';
echo '<input type="checkbox" name="entry[3]" value="moredata">';
echo '<input type="checkbox" name="entry[4]" value="moredata">';
}
function save_post_reference($post_id) {
if (! current_user_can('edit_post', $post_id)) {
return;
}
if (! isset($_POST['reference_nonce'])) {
return;
}
if (! wp_verify_nonce($_POST['reference_nonce'], 'reference_meta_box')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (! isset($_POST['post_reference_name']) || ! isset($_POST['post_reference_link'])) {
return;
}
$reference_name = sanitize_text_field($_POST['post_reference_name']);
$reference_link = sanitize_text_field($_POST['post_reference_link']);
// looping through the checkboxes
for ($i = 0; $i < 5; $i++) {
$teachers_names = sanitize_text_field($_POST['entry'][$i]);
}
update_post_meta($post_id, '_post_reference_name', $reference_name);
update_post_meta($post_id, '_post_reference_link', $reference_link);
再次,我在这里放什么?
update_post_meta($post_id, 'whatdoIputhere?', $teachers_names); // what do I put here?
}
add_action('save_post', 'save_post_reference');
请问有人能帮我吗?
答
你的HTML代码应该是这样的:
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
现在你将保存数据:
key = 'entry';
$values_to_save = array();
$new_values = $_POST['entry'];
$existing_values = get_post_meta($post_id, $key, true) ;
if(!empty($existing_values)){
foreach((array) $existing_values as $existing_value){
$values_to_save[] = $existing_value;
}
}
if(!empty($new_values)){
foreach((array) $new_values as $new_value){
$values_to_save[] = $new_value ;
}
}
update_post_meta($post_id, $key, $values_to_save);
我们获取数据使用下面的代码:
$key = 'entry';
$values = get_post_meta($post_id, $key, true);
foreach((array) $values as $value){
echo $value . '<br>';
}
答
好,我用你的代码更新了我的功能,现在看起来如此:
function add_post_reference() {
add_meta_box('post-reference', 'Reference', 'referenceCallBack', 'languagecourses', 'side', 'high');
}
add_action('add_meta_boxes', 'add_post_reference');
// callback
function referenceCallBack($post) {
wp_nonce_field('reference_meta_box', 'reference_nonce');
$name_value = get_post_meta($post->ID, '_post_reference_name', true);
$link_value = get_post_meta($post->ID, '_post_reference_link', true);
$key = 'entry';
$values = get_post_meta($post_id, $key, true);
foreach((array) $values as $value){
echo $value . '<br>';
}
echo '<label for="reference-name">'. 'Reference Name' .'</label>';
echo '<input type="text" id="reference-name" name="post_reference_name" placeholder="Example" value="'.$name_value.'" size="25"/>';
echo '<p class="howto">'. 'Add the name of the reference' .'</p>';
echo '<label for="reference-link">'. 'Reference Link' .'</label>';
echo '<input type="text" id="reference-link" name="post_reference_link" placeholder="http://www.example.com/" value="'.$link_value.'" size="25"/>';
echo '<p class="howto">'. 'Add the link of the reference' .'</p>';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
echo '<input type="checkbox" name="entry[]" value="moredata">';
}
function save_post_reference($post_id) {
if (! current_user_can('edit_post', $post_id)) {
return;
}
if (! isset($_POST['reference_nonce'])) {
return;
}
if (! wp_verify_nonce($_POST['reference_nonce'], 'reference_meta_box')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (! isset($_POST['post_reference_name']) || ! isset($_POST['post_reference_link'])) {
return;
}
$reference_name = sanitize_text_field($_POST['post_reference_name']);
$reference_link = sanitize_text_field($_POST['post_reference_link']);
$key = 'entry';
$values_to_save = array();
$new_values = $_POST['entry'];
$existing_values = get_post_meta($post_id, $key, true) ;
if(!empty($existing_values)){
foreach((array) $existing_values as $existing_value){
$values_to_save[] = $existing_value;
}
}
if(!empty($new_values)){
foreach((array) $new_values as $new_value){
$values_to_save[] = $new_value ;
}
}
update_post_meta($post_id, $key, $values_to_save);
update_post_meta($post_id, '_post_reference_name', $reference_name);
update_post_meta($post_id, '_post_reference_link', $reference_link);
}
add_action('save_post', 'save_post_reference');
我改变的一件事是,key =
到$key =
,否则它会抛出一个错误。
仍然 - 没有改变......我想过的一件事情是,它可以保存数据,但复选框仍未选中?
简单你的元键......使用'get_post_meta($ post_ID,'your key',true);'获取数据和'update_post_meta($ post_id,'your key',$ teachers_names);'to保存它 –
我想弄清楚到底什么是元键,前两个我看到他们使用的输入字段的名称是这样的: 'update_post_meta($ post_id,'_post_reference_name',$ reference_name); update_post_meta($ post_id,'_post_reference_link',$ reference_link);' 所以我把'entry []'放在这里,但它不保存。 'update_post_meta($ post_id,'entry []',$ teachers_names); ' 你能否在这里摆脱一些光? – oneday
'update_post_meta($ post_id,'entry',$ teachers_names)'This is sufficient –