английский не мой родной язык, но я изо всех сил стараюсь описать вам мою проблему.
Я работаю над плагином для WooCommerce
Я не думаю, что это действительно актуально, но в любом случае …
Я настроил пользовательский пост-тип, а также назначил custom-taxonomy
на этот пост-тип.
Для каждого пользовательского термина таксономии я создаю metabox
на тип продукта.
Каждый метабокс уникален, потому что я передаю термин-слизень.
function add_post_meta_boxes() {
$args = array(
'type' => 'product',
'taxonomy' => 'picto_group',
'orderby' => 'term_group',
'order' => 'ASC'
);
$groups = get_categories($args);
foreach($groups as $group) {
//
$slug = $group->slug;
$name = $group->name;
$count = $group->category_count;
$desc = $group->category_description;
$catid = $group->cat_ID;
add_meta_box(
'i3_picto_'.$slug, // Unique ID
$name.' - '.$count, // Title
'i3_picto_meta_box', // Callback function
'product', // Admin page (or post type)
'normal', // Context
'low', // Priority
array($slug, $catid, $desc)// Arguments to pass into the callback function
);
}// End foreach
}
это metabox
чем заполнены все сообщения, которые имеют пользовательский термин.
function i3_picto_meta_box( $object, $box ) {
$slug = $box['args'][0];
$catid = $box['args'][1];
$desc = $box['args'][2];
?>
<p>
<?php
$args = array(
'post_type' => 'product_picto', // Post-Type name
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'picto_group', // Taxonomy name
'field' => 'id',
'terms' => $catid // Term ID
)
)
);
$pictograms = get_posts( $args );
foreach ( $pictograms as $pictogram ) :
setup_postdata( $pictogram );
$pslug = $pictogram->post_name;
$checked = get_post_meta($pictogram->ID, 'cb-one[cb-'.$slug.'_'.$pslug.']', true);
?>
<div class="group-<?php echo $slug; ?>-<?php echo $pslug; ?>">
<label for="cb-<?php echo $slug; ?>_<?php echo $pslug; ?>">
<?php echo get_the_post_thumbnail( $pictogram->ID, 'thumbnail' ); ?>
<?php the_title(); ?>
<?php the_content(); ?>
<input type="checkbox" name="cb-one[cb-<?php $slug; ?>_<?php $pslug;?>']" id="cb-<?php echo $slug; ?>_<?php echo $pslug; ?>" <?php if( $checked == true ) { ?>checked="checked"<?php } ?> />
</label>
</div>
<?php
endforeach;
wp_reset_postdata();
?>
</p>
<?php }
Все сообщения показывают заголовок, миниатюру и содержание.
Я также буду отображать флажок в каждом сообщении.
Поэтому, когда я редактирую некоторые продукты, я могу проверить некоторые сообщения по некоторым категориям.
В конце эти посты должны показываться также в начале.
Теперь у меня большие проблемы с тем, как я могу сохранить состояние для каждого флажка.
Потому что все мои метабоксы генерируются автоматически, и, как вы можете видеть, мое поле-флажок имеет автоматически генерируемое имя «term-slug» + «post-slug».
Как я могу передать сгенерированное имя поля флажка моему save_post function
?
Я думаю, что я назвал свои поля-флажки неправильно, и я также думаю, что мне нужно запустить цикл foreach для update_post_meta в моей функции сохранения?
Может быть, я думаю, что здесь слишком сложно.
Может быть, кто-то может понять это и получить некоторую полезную информацию для меня.
Спасибо,
Mo
ОБНОВИТЬ
Привет ребят,
поэтому сегодня я работал над ним и обновил свой код. Теперь я могу уже спасти metaboxes
а также checked
государство. Но что-то не совсем правильно.
Я надеюсь, что это нормально, что я редактирую свой Вопрос вместо того, чтобы комментировать.
Новый checkbox
код выглядит так:
<input type="checkbox" name="cb-one[]" id="cb-<?php echo $slug; ?>_<?php echo $pslug; ?>" value="<?php echo $pid; ?>" <?php checked( in_array( $pid, $pictoarray ) ); ?> />
И функция для сохранения metabox
выглядит так:
function i3_save_post_class_meta( $post_ID ) {
global $post;
if(isset( $_POST['cb-one'] ))
{
$custom = $_POST['cb-one'];
$old_meta = get_post_meta($post->ID, '_cb-one');
// Update post meta
if(!empty($old_meta)){
update_post_meta($post->ID, '_cb-one', $custom );
} else {
add_post_meta($post->ID, '_cb-one', $custom );
}
}
}
Чтобы иметь возможность также получить checked=checked
состояние отдельных флажков я добавил этот код в верхней части моего i3_picto_meta_box
функция:
global $post;
$pictolist = get_post_meta( $post->ID, '_cb-one');
if (!empty($pictolist[0])) {
$pictoarray = $pictolist[0]; // Get the right array
}
Здесь я получаю метаданные в виде массива и на входном элементе проверяю, есть ли значение этого элемента также в этом массиве.
С помощью этих обновлений теперь я могу установить несколько флажков в своем сообщении / продукте. Идентификаторы выбранных сообщений сохраняются, и я также могу получить их в веб-интерфейсе.
Я работаю с флажками, потому что хочу иметь возможность снимать их в будущем.
Итак, я попробовал это, я выбрал несколько флажков и сохранил сообщение. После этого я не проверял каждый флажок и сохранен снова.
К сожалению, все флажки остались отмеченными!
Чем я снял только одну коробку и сохранил, все было хорошо.
Я продолжил с этим один за другим, чтобы выяснить, что каждый раз последний флажок всегда остается отмеченным.
Я могу снять все флажки, кроме одного.
Как только я сохраню сообщение, один флажок все равно будет отмечен.
Я надеюсь, что кто-то может помочь мне решить эту проблему.
Спасибо мо
Как почти всегда после того, как задать вопрос, я нашел решение;)
Я это сделал. Проблема была просто в моей функции сохранения. Функция была настроена на добавление метаданных, когда флажок не установлен.
Поэтому я изменил это на это:
/**
* Saving the meta-boxes
**/
function i3_save_post_class_meta( $post_ID ) {
global $post;
if(isset( $_POST['cb-one']))
{
$custom = $_POST['cb-one'];
$old_meta = get_post_meta($post->ID, '_cb-one');
// Update post meta
//if(!empty($old_meta)){
update_post_meta($post->ID, '_cb-one', $custom );
//}
}else{
delete_post_meta($post->ID, '_cb-one', $custom );
}
}
Надеюсь, что это также может помочь другим людям.
Других решений пока нет …