Adicionar campo personalizado à categoria


22

Gostaria de adicionar campos personalizados a uma determinada categoria. Uma categoria possui apenas os seguintes campos:

Nome:

Lesma:

Pai:

Descrição:

Como tenho um site de séries de TV, quero adicionar mais alguns campos, quero algo assim quando crio uma nova categoria (Categoria = Série)

Nome:

Artista:

Ano:

Tipo:

Gênero:

Resumo:

Lesma:

Pai:

Descrição:

E assim por diante...

Alguma ajuda por favor? Desde já, obrigado.



Aqui está uma folha de dicas que eu uso ao fazer isso. Possui os ganchos e filtros de ação relevantes em uma pequena lista. charlestonsw.com/...
Lance Cleveland

Respostas:


24

Eu publiquei um How To sobre isso há uma semana http://en.bainternet.info/2011/wordpress-category-extra-fields

espero que isto ajude.

Ohad.


Aqui estão os detalhes do post:

A primeira coisa que precisamos fazer é adicionar os campos extras ao formulário de edição de categoria usando o gancho edit_category_form_fields e usamos uma função simples que imprimirá os campos extras.

<?php
//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');

//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_Image_url"><?php _e('Category Image Url'); ?></label></th>
<td>
<input type="text" name="Cat_meta[img]" id="Cat_meta[img]" size="3" style="width:60%;" value="<?php echo $cat_meta['img'] ? $cat_meta['img'] : ''; ?>"><br />
        <span class="description"><?php _e('Image for category: use full url with '); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra1"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra1]" id="Cat_meta[extra1]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra1'] ? $cat_meta['extra1'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra2"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra2]" id="Cat_meta[extra2]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra2'] ? $cat_meta['extra2'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra3"><?php _e('extra field'); ?></label></th>
<td>
        <textarea name="Cat_meta[extra3]" id="Cat_meta[extra3]" style="width:60%;"><?php echo $cat_meta['extra3'] ? $cat_meta['extra3'] : ''; ?></textarea><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<?php
}

Como você pode ver, adicionei 4 novos campos e todos eles estão em uma matriz Cat_meta [key], porque dessa forma criamos apenas na linha da tabela de opções para salvar todos os campos extras da categoria em vez de uma linha para cada campo.

Em seguida, precisamos salvar os campos extras no banco de dados assim que um usuário enviar o formulário de edição da categoria e o fizermos usando "category_ editado" com uma função que percorrerá cada um dos campos enviados e os inserirá no banco de dados usando a função update_option , como isso:

<?php
// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');

// save extra category extra fields callback function
function save_extra_category_fileds( $term_id ) {
    if ( isset( $_POST['Cat_meta'] ) ) {
        $t_id = $term_id;
        $cat_meta = get_option( "category_$t_id");
        $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key){
            if (isset($_POST['Cat_meta'][$key])){
                $cat_meta[$key] = $_POST['Cat_meta'][$key];
            }
        }
        //save the option array
        update_option( "category_$t_id", $cat_meta );
    }
}

No código acima, você pode ver que todos os campos extras adicionados foram armazenados na tabela de opções do banco de dados com o nome 'category_ID', em que ID é o ID da categoria específica que acabamos de editar e isso significa que podemos chamar isso dados em nossos plugins ou arquivos de temas facilmente usando a função get_option.

digamos, por exemplo, meu código de categoria é 25, então meu código será semelhante

<?php $cat_data = get_option('category_25'); ?>

Como afirmei no começo, preciso exibir uma imagem diferente para cada categoria. Nesse caso, adicionei essas poucas linhas de código à category.php do meu tema logo após o código que exibe o título da categoria:

<?php
//first get the current category ID
$cat_id = get_query_var('cat');

//then i get the data from the database
$cat_data = get_option("category_$cat_id");

//and then i just display my category image if it exists
if (isset($cat_data['img'])){
    echo '<div class="category_image"><img src="'.$cat_data['img'].'"></div>';
}

Agradável e fácil, e estamos todos prontos. O resultado deve ser semelhante a este:

insira a descrição da imagem aqui


4
Poste o conteúdo principal do seu blog nesta resposta. Podridão do link pode acontecer, mesmo em seu próprio blog.
Django Reinhardt

1
Esta foi respondida em 2011 buddy :)
Bainternet

1
O que você quer dizer?
Django Reinhardt

4
Se você acha que essa resposta não tem nenhum valor, ela deve ser excluída ... No entanto, esta pergunta tem mais de 16.000 visualizações. Eu acho que a pergunta permanece útil para as pessoas, apesar de sua idade, e essa resposta seria melhorada incluindo os detalhes do link em questão.
Django Reinhardt

4
... enquanto vocês estavam ocupados debatendo (um ano atrás), levei menos de 5 minutos para trazer tudo para a resposta. É fácil ...
MxmastaMills

18

A partir do Wordpress 4.4, as funções add_term_meta () , update_term_meta () e get_term_meta () foram adicionadas. Isso significa que o código fornecido pelo MxmastaMills pode ser atualizado para usar uma abordagem muito menos invasiva.

Aqui está a minha atualização. Há apenas um campo que eu gostaria de adicionar um título personalizado, mas funcionará da mesma forma para todos os campos que você deseja adicionar.

function addTitleFieldToCat(){
    $cat_title = get_term_meta($_POST['tag_ID'], '_pagetitle', true);
    ?> 
    <tr class="form-field">
        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Category Page Title'); ?></label></th>
        <td>
        <input type="text" name="cat_title" id="cat_title" value="<?php echo $cat_title ?>"><br />
            <span class="description"><?php _e('Title for the Category '); ?></span>
        </td>
    </tr>
    <?php

}
add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');

function saveCategoryFields() {
    if ( isset( $_POST['cat_title'] ) ) {
        update_term_meta($_POST['tag_ID'], '_pagetitle', $_POST['cat_title']);
    }
}
add_action ( 'edited_category', 'saveCategoryFields');

2
Poucas coisas a serem observadas: no edited_categorygancho, tag_IDestará no $_POSTarray, não no $_GET. Também add_term_metairá realmente adicionar uma nova entrada em vez de substituir uma possível antiga. Use em update_term_metavez disso.
Martin Dimitrov

@MartinDimitrov Você pode corrigir a resposta de luke-simmons clicando no botão editar? Dessa forma, todos podem usar o melhor código disponível, mesmo quem não codifica muito bem (designer aqui!). Obrigado!
930 Hugo Hugo

1
Ele não salvar os dados em forma
Dev

@ Dev ele salva dados, apenas não os mostra, a menos que você altere $ _POST para $ _GET na segunda linha.
banesto 24/08

3

Este código funciona:

add_action ( 'edit_category_form_fields', function( $tag ){
    $cat_title = get_term_meta( $tag->term_id, '_pagetitle', true ); ?>
    <tr class='form-field'>
        <th scope='row'><label for='cat_page_title'><?php _e('Category Page Title'); ?></label></th>
        <td>
            <input type='text' name='cat_title' id='cat_title' value='<?php echo $cat_title ?>'>
            <p class='description'><?php _e('Title for the Category '); ?></p>
        </td>
    </tr> <?php
});
add_action ( 'edited_category', function() {
    if ( isset( $_POST['cat_title'] ) )
        update_term_meta( $_POST['tag_ID'], '_pagetitle', $_POST['cat_title'] );
});

Isso é menos desajeitado que o outro e eu apenas o verifiquei com o WordPress 5.2.2
nico gawenda 25/07

1

Paul Menard forneceu um exemplo de como criar e usar o termo meta em seu blog ...
Meta personalizada para novas taxonomias no WordPress 3.0 .

Não há exemplo de criação da tabela DB ou verificação de $_POSTvars, então você precisará fazer essas pequenas coisas sozinho, mas parece uma base de código decente para construir sobre ... :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.