английский не мой родной язык, но я изо всех сил стараюсь описать вам свою проблему.
Я работаю над надстройкой для 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 в моей функции сохранения?
Может быть, я думаю слишком сложно здесь.
Может быть, кто-то может понять это и иметь какую-то полезную информацию для меня.
Спасибо, Мо
ОБНОВЛЕНИЕ
Привет ребят,
поэтому сегодня я работал над своим кодом и обновлял его. Теперь я уже могу сохранить свое состояние 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
}
Здесь я получаю метаданные в виде массива и на входном элементе проверяю, находится ли значение этого элемента также в этом массиве.
Благодаря этим обновлениям я теперь могу установить несколько флажков в своем посте/продукте. Идентификаторы выбранных сообщений сохраняются, и я также могу получить их во внешнем интерфейсе.
Я работаю с флажками, потому что хочу иметь возможность снимать их в будущем.
Итак, я попробовал это, я установил несколько флажков и сохранил сообщение. После этого я снял флажок все и снова сохранил.
К сожалению, все флажки остались отмеченными!
Затем я снял только один флажок и сохранил, все было в порядке. Я продолжил с этим один за другим, просто чтобы узнать, что каждый раз, когда последний флажок всегда остается отмеченным.
Я могу снять все флажки, кроме одного. Как только я сохраню сообщение, один флажок все еще будет установлен.
Я надеюсь, что кто-то может помочь мне решить эту проблему.
Спасибо, Мо