Пользовательский мета-бокс WordPress, сообщения и несколько флажков

английский не мой родной язык, но я изо всех сил стараюсь описать вам мою проблему.

Я работаю над плагином для 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
}

Здесь я получаю метаданные в виде массива и на входном элементе проверяю, есть ли значение этого элемента также в этом массиве.

С помощью этих обновлений теперь я могу установить несколько флажков в своем сообщении / продукте. Идентификаторы выбранных сообщений сохраняются, и я также могу получить их в веб-интерфейсе.

Я работаю с флажками, потому что хочу иметь возможность снимать их в будущем.

Итак, я попробовал это, я выбрал несколько флажков и сохранил сообщение. После этого я не проверял каждый флажок и сохранен снова.

К сожалению, все флажки остались отмеченными!

Чем я снял только одну коробку и сохранил, все было хорошо.
Я продолжил с этим один за другим, чтобы выяснить, что каждый раз последний флажок всегда остается отмеченным.

Я могу снять все флажки, кроме одного.
Как только я сохраню сообщение, один флажок все равно будет отмечен.

Я надеюсь, что кто-то может помочь мне решить эту проблему.

Спасибо мо

1

Решение

Как почти всегда после того, как задать вопрос, я нашел решение;)

Я это сделал. Проблема была просто в моей функции сохранения. Функция была настроена на добавление метаданных, когда флажок не установлен.

Поэтому я изменил это на это:

/**
* 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  );
}

}

Надеюсь, что это также может помочь другим людям.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]