Salvar termos de taxonomia

16

Eu tenho um problema interessante que espero que alguém possa responder rapidamente.

Criei minha própria metabox que, com base no "MEU CÓDIGO METABOX" (lista abaixo), está exibindo corretamente uma lista suspensa de todos os meus termos na taxonomia "event_types" que criei.

Onde estou enfrentando um problema é poder SALVAR / ATUALIZAR o termo associado a uma postagem quando um termo diferente é selecionado no menu suspenso e a postagem é atualizada.

Depois de mexer com vários bits de código, consegui descobrir que, inserindo manualmente o (s) número (s) term_ID (separado por vírgulas) na área da matriz, estou obtendo os resultados que estou procurando.

Por exemplo, se ao salvar a postagem, uma função chamasse esse código

wp_set_post_terms( $post_id, array(5,7), 'event_types', FALSE);

então minha postagem ATUALIZARÁ e associará o term_ID 5 e 7 a ele que, como você pode ver, estou passando na matriz. O problema é que isso está codificado no meu arquivo functions.php e não se baseia em um valor suspenso selecionado pelo usuário (nota: na verdade, estou apenas tentando passar um ID, mas fiz dois para o teste, conforme explicado abaixo).

Também pude descobrir que, se eu adicionar o código a seguir no meu arquivo metabox, poderá fazer eco de uma lista de IDs de termo atribuídos, mas o último item terá vírgula.

<?php $event_types = wp_get_object_terms($post->ID, 'event_types'); 
foreach ($event_types as $event_type) { echo $event_type->term_id . ','; } ?>

Então ... parece que tenho 85% do meu problema resolvido. Os 15% restantes do meu problema permanecem os seguintes:

  1. O que preciso adicionar ao meu código de arquivo functions.php (listado abaixo) para que, quando eu criar / atualizar uma postagem, o NEW VALUE selecionado na minha lista suspensa de taxonomia seja passado para a matriz?

  2. Embora neste exemplo eu esteja procurando garantir que apenas uma taxonomia ÚNICA possa ser associada a uma postagem, há outras situações em que eu gostaria de criar uma lista de caixas de seleção que exigiria que eu passasse mais de um valor para a matriz. Como tal, o que eu precisaria alterar para que uma lista separada por vírgula de IDs de termo seja passada para a matriz? Se a sua resposta envolver o uso de parte ou parte do código de exemplo listado acima, onde reproduzo os IDs, como garantir que o último ID impresso não tenha vírgula no final? (Existe uma maneira diferente / melhor de fazer isso? Vi dicas que podem estar relacionadas à adição de um filtro, mas não tenho certeza de como isso é feito ...)

Muito obrigado antecipadamente - abaixo está o código que estou usando atualmente em cada arquivo.

CÓDIGO EM MINHAS FUNÇÕES.PHP ARQUIVO

function save_event_taxonomy_terms($meta, $post_id) {
        $event_types = wp_get_object_terms($post->ID, 'event_types'); 
        wp_set_post_terms( $post_id, array($names), 'event_types', FALSE);
    }

MEU CÓDIGO METABOX

<select name='post_event_types' id='post_event-types'>
// DISPLAY TERMS AS DROP DOWN OPTIONS
    <?php 
    $names = wp_get_object_terms($post->ID, 'event_types'); 
    $event_types = get_terms('event_types', 'hide_empty=0'); 
    ?>
    <option class='event_type-option' value='' <?php if (!count($names)) echo "selected";?>>Not Assigned</option>
    <?php foreach ($event_types as $event_type) {
        if (!is_wp_error($names) && !empty($names) && !strcmp($event_type->slug, $names[0]->slug)) 
        echo "<option class='event_type-option' value='" . $event_type->slug . "' selected>" . $event_type->name . "</option>\n"; 
        else
        echo "<option class='event_type-option' value='" . $event_type->slug . "'>" . $event_type->name . "</option>\n"; 
    }
    ?>
</select>
NetConstructor.com
fonte

Respostas:

6

Pensei em postar a resposta depois que Dimas pudesse me ajudar.

Utilizando sua classe WPAlchemey, adicionei um save_action var que se parecia com isso (observe que estou usando a taxonomia de "categoria" que, é claro, você pode mudar para qualquer que seja sua taxonomia personalizada):

'save_action'   => 'save_taxonomy_terms',

Em seguida, adiciono a seguinte função para isso, da seguinte maneira:

function save_taxonomy_terms($meta, $post_id) {
wp_set_post_terms($post_id, array($meta['my_terms']), 'category', FALSE);
}

Um código my metabox que exibe a lista suspensa de taxonomias se parece com isso:

<label>Event Category:</label>
    <?php $terms = get_terms('category', 'hide_empty=0'); ?>
    <?php $mb->the_field('my_terms'); ?>
    <select name="<?php $mb->the_name(); ?>">
    <option value='' <?php if (!count($terms)) echo "selected";?>>Not Assigned</option>
    <?php foreach ($terms as $term): ?>
    <option value="<?php echo $term->term_id; ?>"<?php $mb->the_select_state($term->term_id); ?><?php echo '>' . $term->name; ?></option>
    <?php endforeach; ?>
    </select>
NetConstructor.com
fonte