it-swarm.com.de

WP Post und benutzerdefinierte Taxonomie einfügen

Ich habe in meinem WordPress einen benutzerdefinierten Beitragstyp mit einer benutzerdefinierten Taxonomie erstellt.

Das Post-Erfassungsdatum vom Ende der Website mithilfe von wp_insert_post ().

Dies ist mein Registrierungscode für die benutzerdefinierte Post:

$labels = array(
        'name' => 'Films',
        'singular_name' => 'Film',
        'add_new' => 'Add new',
        'add_new_item' => 'Add new film',
        'edit_item' => 'Edit film',
        'new_item' => 'New film',
        'all_items' => 'All films',
        'view_item' => 'View film',
        'search_items' => 'Search films',
        'not_found' =>  'No films found',
        'not_found_in_trash' => 'No films found in Trash', 
        'parent_item_colon' => '',
        'menu_name' => 'Films'
    );

    $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);

Und das ist mein Custom Taxonomy Registrierungscode:

$labels = array(
        'name' => 'Category',
        'singular_name' => 'Film',
        'search_items' =>  'Search Categories',
        'all_items' => 'All Categories',
        'parent_item' => 'Parent Category',
        'parent_item_colon' => 'Parent Category:',
        'edit_item' => 'Edit Category', 
        'update_item' => 'Update Category',
        'add_new_item' => 'Add New Category',
        'new_item_name' => 'New Category Name',
        'menu_name' => 'Category'
    );

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

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

beide werden bei der Init-Aktion abgefeuert.

Und jetzt, wenn der Endbenutzer das Formular vom Front-End absendet, führe ich diesen Code aus:

$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);

In meinem Frontend-Formular habe ich das Auswahlfeld "Kategorie", das die Filmkategorien enthält. Ich habe versucht, Optionswerte für die Begriffe ID, Name und Slug hinzuzufügen, aber es funktioniert nicht.

der neue Beitrag wird in meinem benutzerdefinierten Beitragstyp erstellt, aber ich kann die Filmkategorien nicht zuweisen.

Irgendeine Idee bitte?

5
Merianos Nikos

Wo ist der Code, der die $_POST-Daten verarbeitet? Ist es in einer Vorlagendatei? Oder ist es in einer Funktion, die an einem Haken ausgeführt wird? Wenn dies der Fall ist und taxonomy_exists()false zurückgibt, wie Sie hier vorschlagen (http://wordpress.stackexchange.com/questions/45798/wp-insert-post-and-custom-taxonomy#comment58402_45810), ist es möglich, dass Sie Überprüfe erneut, bevor register_taxonomy die Chance hat, ausgeführt zu werden. Stellen Sie sicher, dass Ihre Formularbearbeitungsfunktion an einen späteren Zeitpunkt als init:10 gebunden ist.

2
Boone Gorges

Sie sollten nicht brauchen, um zu verwenden:

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

und der tax_input-Array-Wert. Das letztere Ersteres (siehe Endanmerkung) sollte ausreichen.

Wenn $_POST['category'] den Begriff IDs enthält, müssen Sie diese als Ganzzahlen umwandeln, damit sie nicht als Slugs interpretiert werden.

Auch wenn $_POST['category'] ein array ist, verursacht die Verwendung von array($_POST['category']) die Probleme. Versuchen:

 //Cas as array
 $terms = isset($_POST['category']) ? (array) $_POST['category'] : array();

 //Cast array values as integers if $_POST['category'] contains IDs
 $terms = array_map('intval',$terms);

 $post = array(
      //other arguments

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

    $new_film_id = wp_insert_post($post);

Anmerkung

Rarst macht einen guten Punkt in den Kommentaren, von denen ich denke, dass sie hervorgehoben werden müssen:

wp_insert_post () überprüft die Berechtigung für tax_input und schlägt fehl, wenn der Benutzer nicht angemeldet ist. Es ist eine schlechte Wahl für nicht typische Post-Inserts. Das explizite wp_set_object_terms () ist besser für Anwendungsfälle wie Migrationen, Front-End-Übermittlungen usw

3
Stephen Harris

Ich habe festgestellt, dass ich mit isset()wp_insert_post() für benutzerdefinierte Beitragstypen verwenden kann:

if ( !isset( $id ) ) {
    $id = wp_insert_post( $new, true ); 
}
1
Emilio