Пользовательский мета-бокс 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 в моей функции сохранения?

Может быть, я думаю слишком сложно здесь.

Может быть, кто-то может понять это и иметь какую-то полезную информацию для меня.

Спасибо, Мо


ОБНОВЛЕНИЕ

Привет ребят,

поэтому сегодня я работал над своим кодом и обновлял его. Теперь я уже могу сохранить свое состояние 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
}

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

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

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

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

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

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

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

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

Спасибо, Мо


person LWS-Mo    schedule 15.04.2015    source источник
comment
Не ответ, поэтому приношу извинения, но вам следует использовать плагин Custom Post Type UI (и плагин расширенных настраиваемых полей). Я знаю, что не следует полагаться на плагины, но я использовал эти два плагина в своем последнем быстром фриланс-проекте, и, черт возьми, они помогли. Я новообращенный. Они настолько сильны, что неиспользование их почти представляет собой ошибку NIH... по крайней мере, таково мое мнение... но откуда мне знать, что я не хардкорный разработчик WP.   -  person picus    schedule 17.04.2015
comment
Привет Пикус, спасибо за предложение. Но я также пытаюсь немного научиться здесь :). Как видите, мой код не самый чистый, и я пытаюсь улучшить его. Но, как всегда, сразу после публикации этого вопроса я все понял! Отредактирую свой пост через минуту.   -  person LWS-Mo    schedule 17.04.2015
comment
классно приятно слышать. Я бы проверил их для вашего следующего проекта, они действительно пригодятся, если у вас есть несколько типов контента для создания.   -  person picus    schedule 17.04.2015


Ответы (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  );
    }

}

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

person LWS-Mo    schedule 17.04.2015