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?