WP inserare post și taxonomie personalizată

16 mar. 2012, 13:42:34
Vizualizări: 16K
Voturi: 5

Am creat un tip de postare personalizat în WordPress asociat cu o taxonomie personalizată.

Postarea colectează date din partea frontală a site-ului folosind wp_insert_post().

Acesta este codul meu de înregistrare a postării personalizate:

$labels = array(
        'name' => 'Filme',
        'singular_name' => 'Film',
        'add_new' => 'Adaugă nou',
        'add_new_item' => 'Adaugă film nou',
        'edit_item' => 'Editează film',
        'new_item' => 'Film nou',
        'all_items' => 'Toate filmele',
        'view_item' => 'Vezi film',
        'search_items' => 'Caută filme',
        'not_found' => 'Nu s-au găsit filme',
        'not_found_in_trash' => 'Nu s-au găsit filme în Coșul de gunoi', 
        'parent_item_colon' => '',
        'menu_name' => 'Filme'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true, 
        'show_in_menu' => true, 
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'has_archive' => true, 
        'hierarchical' => false,
        'menu_position' => null,
        'taxonomies' => array('film_category'),
        'supports' => array(
            'title',
            'editor'
        )
    );

    register_post_type('film', $args);

Și acesta este codul meu de înregistrare a taxonomiei personalizate:

$labels = array(
        'name' => 'Categorii',
        'singular_name' => 'Film',
        'search_items' => 'Caută categorii',
        'all_items' => 'Toate categoriile',
        'parent_item' => 'Categoria părinte',
        'parent_item_colon' => 'Categoria părinte:',
        'edit_item' => 'Editează categoria', 
        'update_item' => 'Actualizează categoria',
        'add_new_item' => 'Adaugă categorie nouă',
        'new_item_name' => 'Numele noii categorii',
        'menu_name' => 'Categorie'
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
        'rewrite' => false,
        'capabilities' => array('manage_terms') 
    );

    register_taxonomy('film_category', array('film'), $args);

Ambele sunt declanșate la acțiunea init.

Când utilizatorul trimite formularul din partea frontală, execut acest cod:

$post = array(
            'comment_status' => 'closed',
            'ping_status' => 'closed',
            'post_author' => 2,
            'post_content' => $_POST['synopsis'],
            'post_name' => sanitize_title($_POST['title']),
            'post_status' => 'private',
            'post_title' => $_POST['title'],
            'post_type' => 'film',
            'tax_input' => array(
                'film_category' => array(
                    $_POST['category']
                )
            )
        );

        $new_film_id = wp_insert_post($post);

        wp_set_object_terms($new_film_id, $_POST['category'], 'film_category', true);

În formularul meu din partea frontală am un câmp select "category" care conține categoriile de filme. Am încercat să adaug în valorile opțiunilor ID-ul termenilor, Numele termenilor și Slug-ul termenilor, dar nu funcționează.

Postarea nouă este generată în tipul meu de postare personalizată, dar nu pot atribui categoriile de filme.

Vreo idee, vă rog?

2
Comentarii

Ai verificat dacă $_POST['category'] conține date valide în acel moment? Ai încercat codul într-un test cu date simulate, fără partea de front-end?

Rarst Rarst
16 mar. 2012 13:53:29

Am verificat datele cu print_r imediat după atribuire și acolo sunt datele corecte.

KodeFor.Me KodeFor.Me
16 mar. 2012 13:57:17
Toate răspunsurile la întrebare 3
4

Nu ar trebui să fie nevoie să folosești:

wp_set_object_terms($new_film_id, $_POST['category'], 'film_category', true);

și valoarea matricei tax_input. Ultima Prima (vezi observația finală) ar trebui să fie suficientă.

Dacă $_POST['category'] conține ID-urile termenilor, va trebui să le convertești în numere întregi pentru a nu fi interpretate ca slug-uri.

De asemenea, dacă $_POST['category'] este o matrice, atunci folosirea array($_POST['category']) va cauza probleme. Încearcă:

 //Conversie în matrice
 $terms = isset($_POST['category']) ? (array) $_POST['category'] : array();

 //Convertirea valorilor matricei în numere întregi dacă $_POST['category'] conține ID-uri
 $terms = array_map('intval',$terms);

 $post = array(
      //alte argumente

      'tax_input' => array(
            'film_category' => $terms,
        )
    );

    $new_film_id = wp_insert_post($post);

Observație

Rarst subliniază un aspect important în comentarii care merită evidențiat:

wp_insert_post() va verifica permisiunile pentru tax_input și va eșua dacă utilizatorul nu este autentificat. Nu este o alegere bună pentru inserări de postări netipice, wp_set_object_terms() explicit este mai potrivit pentru cazuri de utilizare precum migrări, trimiteri din front-end, etc.

16 mar. 2012 15:04:09
Comentarii

Bună Stephen Harris. Mulțumesc mult pentru ajutor, dar din păcate încă nu funcționează. Nu știu cu adevărat care este problema. Am eliminat wp_set_object_terms și folosesc doar metoda ta. Ai vreo altă idee? Cu stimă, Merianos Nikos

KodeFor.Me KodeFor.Me
16 mar. 2012 15:26:09

Rețineți că wp_insert_post() va verifica permisiunile pentru tax_input și va eșua dacă utilizatorul nu este autentificat. Nu este o alegere bună pentru inserări de postări non-tipice, wp_set_object_terms() explicit este mai potrivit pentru cazuri de utilizare precum migrații, trimiteri din front-end, etc.

Rarst Rarst
16 mar. 2012 15:33:13

După o căutare profundă, am observat că taxonomia pare să nu existe. Am afișat $wp_taxonomies și taxonomia există în acea variabilă globală. Dar taxonomy_exists returnează false :(

KodeFor.Me KodeFor.Me
16 mar. 2012 15:51:49

@Rarst Cred că ar trebui postat ca un răspuns separat. Foarte frumos.

Christine Cooper Christine Cooper
8 aug. 2015 16:47:17
1

Unde se află codul care preia și procesează datele din $_POST? Este într-un fișier de tip template? Sau este într-o funcție care rulează pe un hook? Dacă este al doilea caz, și dacă taxonomy_exists() returnează false așa cum sugerezi aici (http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810), este posibil să verifici înainte ca register_taxonomy să aibă șansa să ruleze. Asigură-te că funcția ta de procesare a formularului este conectată la ceva care rulează după init:10.

16 mar. 2012 15:58:28
Comentarii

Boone Gorges !!!! Ești pur și simplu perfect !!!!!! Asta a funcționat pentru mine. Până acum apelam funcția care salvează datele mele imediat, iar acum am conectat acea funcție la hook-ul init și a funcționat !! :) Mulțumesc mult :)

KodeFor.Me KodeFor.Me
16 mar. 2012 16:06:48
1

Am descoperit că folosirea funcției isset() mi-a permis să utilizez wp_insert_post() pe tipurile personalizate de articole:

if ( !isset( $id ) ) {
    $id = wp_insert_post( $new, true ); 
}
10 mar. 2015 21:58:19
Comentarii

Te rog să explici de ce acest lucru răspunde la întrebare.

kaiser kaiser
11 mar. 2015 02:05:55