wpbrasil / odin

Framework and base theme for development with WordPress.
http://wpod.in
566 stars 195 forks source link

Inserir post atualizando o term da taxonomy com a class Odin_Post_Form #202

Closed nandomoreirame closed 10 years ago

nandomoreirame commented 10 years ago

Olá, estou utilizando a classe Odin_Post_Form para criar um formulário em um projeto aqui.

Estou tentando atualizar o termo selecionado no formulário com o método set_terms($terms) o parâmetro passado nesse método é um array que é utilizado no método save_terms() onde ele faz um foreach com esse array... foreach ( $this->terms as $taxonomy => $term ) {

Bom, o problema é que eu não estou conseguindo montar esse array da forma correta, pelo menos todos que eu tentei por aqui não deram certo.

Analisando esse foreach parece que ele precisa de um array assim: $terms = array( $taxonomy => $term )... Seria isso?

Eu tentei assim:

$form->set_terms(
    array(
        'tipo_veiculo' => 'Carro',
        'tipo_veiculo' => 'Moto',
        'tipo_veiculo' => 'Caminhão',
        'tipo_veiculo' => 'Bicicleta'
    )
);

Assim:

$form->set_terms(
    array(
        'Carro',
        'Moto',
        'Caminhão',
        'Bicicleta'
    )
);

E assim:

$form->set_terms(
    array(
        'tipo_veiculo'
    )
);

Em que estou errando? Grato.

nandomoreirame commented 10 years ago

Olá alguém podia me ajudar nessa, estou bugando de vez aqui... kkkkkkkkkkk

claudiosanches commented 10 years ago

Isso é cagada que não consegui tempo de colocar na documentação ainda. Antes de mais nada aqui um exemplo de como usar: https://pastebin.com/hxWTcNEY

A ideia é o seguinte set_terms recebe um array onde o index é a taxonomia e o valor é o id do seu campo. Desta forma a classe consegue relacionar qual é o input que esta recebendo o ID do termo que deve ser salvo em qual taxonomia você quer.

Olha no meu exemplo que usei:

// Função qualquer só gerar um array com os ids e nomes das categorias
// retorna como se fosse um array desta forma:
// array( 1 => 'sem categoria', 2 => 'videos' ); 
function odin_categories_array() {
    $output_categories = array();
    $categories = get_categories( array( 'type' => 'post' ) );

    foreach( $categories as $category )
       $output_categories[ $category->cat_ID ] = $category->name;

   return $output_categories;
}
...

// Aqui coloco o id como cpt_category  uso a função declarada para passar o array das opções
array(
    'id'          => 'cpt_category', // Required
    'label'       => __( 'Category', 'odin' ), // Required
    'type'        => 'select', // Required
    'required'    => true, // Optional (bool)
    'attributes'  => array(
        'multiple' => 'multiple'
    ),
    'options'     => odin_categories_array()
),

// Finalmente onde configuro o termo:

$post_type_form->set_terms( array( 'category' => 'cpt_category' ) );

Veja que no exemplo mostra como é utilizado para indicar o que campo vai significar o que para criar o post.

nandomoreirame commented 10 years ago

Ah entendi @claudiosmweb ... mas vc fez com categorias de posts usando o get_categories()... não funciona com get_terms()?

Eu tentei aqui e ele retorna vazio... ou melhor gera o erro: Taxonomia inválida :grin:

nandomoreirame commented 10 years ago

Eu tentei assim:

function f3_category_array() {
    $output_terms = array();

    $output_terms[''] = '-- Selecione --';
    $terms = get_terms( 'acomp_category', array( 'hide_empty' => false ) );

    foreach ($terms as $term)
        $output_terms[ $term->term_id ] = $term->name;

    return $output_terms;
}
claudiosanches commented 10 years ago

Isso dai é apenas para listar e dar as opções com os IDs. PRecisa ver se acertou no nome da sua taxonomia xD

nandomoreirame commented 10 years ago

Oi pessoal, alguém por ai? Então eu ainda estou com esse erro cabuloso ... e ele está perturbando meu cérebro.

A Taxonomia é válida, existe e tem 3 terms cadastrados nela... mas eu fiu dando prints no arquivo class-post-form.php para tentar localizar onde ele me bloqueia e bem no método save_terms() a função do Wordpress wp_set_post_terms() retorna o objeto de erro do Wordpress.. WP_Error onde diz a seguinte mensagem:

WP_Error Object
(
    [errors:WP_Error:private] => Array
        (
            [invalid_taxonomy] => Array
                (
                    [0] => Taxonomia inválida
                )

        )

    [error_data:WP_Error:private] => Array
        (
        )

)

Pesquisando sobre esse tipo de erro eu notei que não é só da função wp_set_post_terms() mas de outras também como a get_terms() e a get_the_terms() como no caso desse cara aqui -> http://wordpress.aspcode.net/view/63538464303732726694401/wordpress-function-gettheterms-returns-invalid-taxonomy-error

Parece que se não tiver carregado o Wordpress por completo ele não consegue localizar a taxonomia e retorna "Taxonomia inválida"... :weary:

Eu ainda não sou um cara Supermotherfucker do Wordpress por isso estou pedindo um help aqui, algum guru por favor me ajude a identificar porque ele não reconhece minha taxonomia, existe algum gancho, uma action ou filtro para ele reconhecer? :grin:

Sem mais, grato.

nandomoreirame commented 10 years ago

O problema talvez seria que as classes do Odin são inclusas no funcions.php antes de qualquer outra função do tema... inclusive a classe class-post-form.php onde está essa função wp_set_post_terms() ... então pela lógica estou tentando localizar minha taxonomia sem antes registrar ela com register_taxonomy() ? :confused:

É só um palpite, e se for isso mesmo eu não faço a minima ideia de como resolver... :sweat: