WordPress

Jak dodać kategorie do niestandardowego typu postu za pomocą wp_insert_post($new_post);

  • 24 kwietnia, 2023
  • 5 min read
Jak dodać kategorie do niestandardowego typu postu za pomocą wp_insert_post($new_post);


Mam niestandardowy typ postu „plik członkowski” i funkcję dla użytkowników (członków) do przesyłania plików. Przesłane pliki są automatycznie publikowane jako wpis „plik członkowski” w zapleczu.

W formularzu przesyłania pliku użytkownicy mogą wybrać tagi i kategorie. I chciałbym, aby te tagi i kategorie zostały przesłane wraz z postem pliku członkowskiego.

Tagi działają dobrze, ale kategorie nie są brane pod uwagę, nie pojawiają się w poście pliku członkowskiego.

To jest część PHP, która sprawia, że ​​post z przesłania:

if (!empty($_FILES['file_upload'])) {
    $file_title = sanitize_text_field($_POST['file_title']);
    $file_upload = $_FILES['file_upload'];
    $file_type = isset($_POST['file_type']) ? sanitize_text_field($_POST['file_type']) : '';
    $file_category = isset($_POST['file_category']) ? sanitize_text_field($_POST['file_category']) : '';

    $uploaded_file = wp_handle_upload($file_upload, array('test_form' => false));

    if (isset($uploaded_file['file'])) {
        $attach_id = wp_insert_attachment($attachment, $uploaded_file['file']);

        // Check if attachment was created successfully
        if (!is_wp_error($attach_id)) {
            $attach_path = get_attached_file($attach_id);
            $attach_data = wp_generate_attachment_metadata($attach_id, $attach_path);
        } else {
            echo $attach_id->get_error_message();
        }
    }

    if (isset($uploaded_file['file'])) {
        $attachment = array(
            'post_mime_type' => $uploaded_file['type'],
            'post_title'     => sanitize_text_field($_POST['file_title']),
            'post_content'   => '',
            'post_status'    => 'inherit',
            'guid'           => $uploaded_file['url']
        );

        $attach_path = get_attached_file($attach_id);

        $attach_data = wp_generate_attachment_metadata($attach_id, $attach_path);

        // Create new post for uploaded file
        $new_post = array(
            'post_title' => sanitize_text_field($_POST['file_title']),
            'post_content' => '',
            'post_status' => 'publish',
            'post_type' => 'memberfile', // custom post type for uploaded files
            'tax_input' => array(
                'post_tag' => array($file_type),
                'category' => array($file_category), // set the first selected category
            ),
            'meta_input' => array(
                'file_path' => $uploaded_file['file'],
            ),
        );

        if (isset($attach_id)) {
            // Add attachment as metadata to the new post
            update_post_meta($new_post['ID'], '_thumbnail_id', $attach_id);
        }

        wp_set_post_terms($new_post_id, array($file_type), 'post_tag');
        wp_set_post_terms($new_post_id, array($file_category), 'category');


        wp_insert_post($new_post);

        echo 'File uploaded successfully.';
    } else {
        echo $uploaded_file['error'];
    }
}

To jest formularz do przesłania pliku, który jest przekształcany w wpis pliku członkowskiego

<form method="post" action="" enctype="multipart/form-data">
        <label style="display:block;" for="file_title">Title:</label>
        <input type="text" name="file_title" id="file_title" required>

        <label style="display:block;" for="file_category">Category:</label>
        <select name="file_category[]" id="file_category">
        <option value="">Select Category</option>
        <?php
            $terms = get_terms(array(
                'taxonomy' => 'category',
                'hide_empty' => false,
            ));

            $excluded_terms = array('Business Strategy', 'Energy Management', 'GET TO KNOW', 'Interview', 'Personal Branding', 'Selfcare', 'Uncategorized');

            // Sort the terms array by name
            usort($terms, function ($a, $b) {
                return strcasecmp($a->name, $b->name);
            });

            foreach ($terms as $term) {
                if (!in_array($term->name, $excluded_terms)) {
                    echo '<option value="' . $term->name . '">' . $term->name . '</option>';
                } else if ($term->count == 0) {
                    echo '<option value="' . $term->name . '">' . $term->name . '</option>';
                }
            }
            ?>
        </select>

        <div id="file_upload_container">
            <label id="file_upload_label" for="file_upload">
                <i class="fas fa-cloud-upload-alt"></i>
                <span>Click to add or drop files</span>
                <span id="selected_file"></span>
            </label>
            <input type="file" name="file_upload" id="file_upload" onchange="handleSelectedFile()" required>
        </div>
        <label style="display:block;" for="file_type">Type:</label>
        <div id="type_buttons">
            <?php
            $type_options = array('Image', 'Excel', 'PDF', 'Word');
            foreach ($type_options as $option) {
                echo '<button type="button" value="' . strtolower($option) . '">' . $option . '</button>';
            }
            ?>
        </div>
        <input type="hidden" name="file_type" id="selected_type">
        <button type="submit">Upload</button>
    </form>

W ten sposób tworzę niestandardowy plik członkowski postu

function register_cpt_memberfile()
{
    register_post_type('memberfile', array(
        'labels' => array(
            'name' => _x('MemberFiles', 'memberfile'),
            'singular_name' => _x('MemberFile', 'memberfile'),
            'add_new' => _x('Add New', 'memberfile'),
            'add_new_item' => _x('Add New MemberFile', 'memberfile'),
            'edit_item' => _x('Edit MemberFile', 'memberfile'),
            'new_item' => _x('New MemberFile', 'memberfile'),
            'view_item' => _x('View MemberFile', 'memberfile'),
            'search_items' => _x('Search MemberFiles', 'memberfile'),
            'not_found' => _x('No MemberFiles found', 'memberfile'),
            'not_found_in_trash' => _x('No MemberFiles found in Trash', 'memberfile'),
            'parent_item_colon' => _x('Parent MemberFile:', 'memberfile'),
            'menu_name' => _x('MemberFiles', 'memberfile')
        ),
        'hierarchical' => true,
        'description' => '',
        'supports' => array('title', 'editor', 'author', 'thumbnail', 'trackbacks', 'page-attributes', 'post-formats'),
        'taxonomies' => array('category', 'post_tag'),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_icon' => '',
        'menu_position' => '5',
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
        'can_export' => true,
        'capability_type' => 'post',
        'rewrite' => false,
        'show_in_rest' => true,
    ));

Masz pomysł, w jaki sposób mogę się upewnić, że gdy ktoś wybierze kategorię w formularzu podczas przesyłania pliku, to znaczy, że pojawi się w niestandardowym poście w zapleczu jako kategoria?

Warto przeczytać!  kategorie — Jak usunąć element z niestandardowego menu Walker_Nav_Menu


Źródło