Last active
November 4, 2023 05:22
-
-
Save deltafrogtechnology/1cf26468002b785943456e4c2222dee7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Add custom columns to the media library table | |
function custom_media_columns($columns) { | |
$columns['assign_media_category'] = 'Assign_media_category'; | |
return $columns; | |
} | |
add_filter('manage_media_columns', 'custom_media_columns'); | |
// Populate custom column with data | |
function custom_media_column_content($column_name, $post_id) { | |
if ($column_name == 'assign_media_category') { | |
$terms = get_the_terms($post_id, 'media-category'); | |
$media_category_list = ''; | |
// Get top-level media categories | |
$top_level_categories = get_terms('media-category', array('parent' => 0, 'hide_empty' => false)); | |
if (!empty($top_level_categories)) { | |
foreach ($top_level_categories as $top_category) { | |
$checked_top = in_array($top_category->term_id, wp_list_pluck($terms, 'term_id')) ? 'checked' : ''; | |
$media_category_list .= '<div class="term">'; | |
$media_category_list .= '<label><input type="checkbox" name="media_category[]" value="' . $top_category->term_id . '" ' . $checked_top . ' />' . esc_html($top_category->name) . '</label>'; | |
$media_category_list .= nest_terms($top_category->term_id, $all_categories, $terms); | |
$media_category_list .= '</div>'; | |
} | |
} | |
// Output the accordion | |
echo '<div class="accordion">'; | |
echo '<h3 class="accordion-title">Update Media Categories</h3>'; | |
echo '<div class="accordion-content">'; | |
echo '<div class="media_category_list">' . $media_category_list . '</div>'; | |
// echo '<button class="button" data-post-id="' . esc_attr($post_id) . '">Save</button>'; | |
echo '<a href="#" class="button xyz" data-post-id="' . esc_attr($post_id) . '">Save</a>'; | |
echo '</div>'; // close accordion-content | |
echo '</div>'; // close accordion | |
} | |
} | |
// Recursive function to nest terms | |
function nest_terms($term_id, $terms, $checked_terms) { | |
$nested_terms = ''; | |
$child_terms = get_terms('media-category', array('parent' => $term_id, 'hide_empty' => false)); | |
if (!empty($child_terms)) { | |
foreach ($child_terms as $child_term) { | |
$checked_child = in_array($child_term->term_id, wp_list_pluck($checked_terms, 'term_id')) ? 'checked' : ''; | |
$nested_terms .= '<div class="term child">'; | |
$nested_terms .= '<label><input type="checkbox" name="media_category[]" value="' . $child_term->term_id . '" ' . $checked_child . ' />' . esc_html($child_term->name) . '</label>'; | |
$nested_terms .= nest_terms($child_term->term_id, $terms, $checked_terms); | |
$nested_terms .= '</div>'; | |
} | |
} | |
return $nested_terms; | |
} | |
add_action('manage_media_custom_column', 'custom_media_column_content', 10, 2); | |
// Add AJAX action in your theme's functions.php | |
function save_post_data() { | |
// Check nonce for security | |
if (isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'ajax-nonce')) { | |
// Get and sanitize the post ID | |
$post_id = isset($_POST['post_id']) ? absint($_POST['post_id']) : 0; | |
// Get the selected media category term IDs | |
$selected_categories = isset($_POST['media_category']) ? array_map('absint', $_POST['media_category']) : array(); | |
// Update the post with the new terms | |
wp_set_post_terms($post_id, $selected_categories, 'media-category', false); | |
// Send a response (you can modify this based on your needs) | |
echo json_encode(array('success' => true)); | |
} else { | |
// Send a response for failed nonce verification (you can modify this based on your needs) | |
echo json_encode(array('success' => false, 'message' => 'Nonce verification failed.')); | |
} | |
// Always exit to avoid extra output | |
exit(); | |
} | |
add_action('wp_ajax_save_post_data', 'save_post_data'); | |
// Output the script in the admin footer | |
function output_custom_script_in_admin_footer() { | |
?> | |
<style> | |
h3.accordion-title { | |
font-size: 13px; | |
text-decoration: underline; | |
text-align: center; | |
display: inline; | |
cursor: pointer; | |
} | |
.accordion { | |
border: 1px solid black; | |
padding: 5px; | |
background: #ebcfcf; | |
} | |
.term.child { | |
margin-left: 10px; | |
} | |
</style> | |
<script> | |
jQuery(document).ready(function($) { | |
$('.accordion-content').hide(); | |
$('.accordion-title').click(function() { | |
$(this).next('.accordion-content').slideToggle(); | |
}); | |
// Attach click event to the button | |
$('.button.xyz').on('click', function(e) { | |
e.preventDefault(); | |
// Get the post ID from the data attribute | |
var post_id = $(this).data('post-id'); | |
// Get the selected media category term IDs | |
var selected_categories = []; | |
$(this).parent().find('input[name="media_category[]"]:checked').each(function() { | |
selected_categories.push($(this).val()); | |
}); | |
// AJAX request | |
$.ajax({ | |
type: 'POST', | |
url: '<?php echo admin_url('admin-ajax.php'); ?>', | |
data: { | |
action: 'save_post_data', | |
nonce: '<?php echo wp_create_nonce('ajax-nonce'); ?>', | |
post_id: post_id, | |
media_category: selected_categories | |
}, | |
success: function(response) { | |
// Handle the response (you can modify this based on your needs) | |
var data = JSON.parse(response); | |
if (data.success) { | |
alert('Data saved successfully!'); | |
} else { | |
alert('Failed to save data. ' + data.message); | |
} | |
}, | |
error: function(error) { | |
console.log(error); | |
} | |
}); | |
}); | |
}); | |
</script> | |
<?php | |
} | |
add_action('admin_footer', 'output_custom_script_in_admin_footer'); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://deltafrog.net/wordpress-media-library-add-custom-taxonomy-with-quick-edit-in-list-view/