Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save deltafrogtechnology/1cf26468002b785943456e4c2222dee7 to your computer and use it in GitHub Desktop.
Save deltafrogtechnology/1cf26468002b785943456e4c2222dee7 to your computer and use it in GitHub Desktop.
<?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