Chào bạn, mình hiểu yêu cầu của bạn và đã từng thực hiện tính năng này trước đây. Dưới đây là hướng dẫn chi tiết giúp bạn chỉnh sửa nhanh phần
Mô tả ngắn (Excerpt) trực tiếp trên trang quản trị bài viết:
Demo:

- Cách chỉnh sửa nhanh phần mô tả (Excerpt) trực tiếp trên trang quản trị bài viết
Bước 1: Thêm đoạn mã này vào file functions.php trong theme đang sử dụng
Mã: Chọn tất cả
// Thêm cột Excerpt vào danh sách bài viết
function add_excerpt_column($columns) {
$columns['excerpt'] = __('Mô tả ngắn', 'mh-magazine-lite');
return $columns;
}
add_filter('manage_posts_columns', 'add_excerpt_column');
// Hiển thị nội dung Excerpt trong cột
function show_excerpt_column_content($column_name, $post_id) {
if ($column_name === 'excerpt') {
$excerpt = get_post_field('post_excerpt', $post_id);
echo '<textarea class="inline-excerpt" data-post-id="' . esc_attr($post_id) . '" style="width: 100%; height: 50px;">' . esc_textarea($excerpt) . '</textarea>';
}
}
add_action('manage_posts_custom_column', 'show_excerpt_column_content', 10, 2);
Bước 2: Tích hợp chỉnh sửa nhanh bằng AJAX
Thêm đoạn mã này để xử lý sự kiện chỉnh sửa và lưu lại nội dung Excerpt khi bạn thoát khỏi ô nhập liệu.
Mã: Chọn tất cả
// Thêm script để xử lý inline editing
function add_excerpt_inline_edit_script() {
?>
<script>
document.addEventListener('DOMContentLoaded', function () {
const excerpts = document.querySelectorAll('.inline-excerpt');
let timeout = null;
excerpts.forEach(function (excerptField) {
excerptField.addEventListener('blur', function () {
clearTimeout(timeout);
timeout = setTimeout(() => {
const postId = this.dataset.postId;
const excerptValue = this.value;
const data = new FormData();
data.append('action', 'save_excerpt_inline');
data.append('post_id', postId);
data.append('excerpt', excerptValue);
fetch(ajaxurl, {
method: 'POST',
body: data,
})
.then(response => response.json())
.catch(error => {
console.error('AJAX Error:', error);
});
}, 300);
});
});
});
</script>
<?php
}
add_action('admin_footer', 'add_excerpt_inline_edit_script');
Bước 3: Lưu Excerpt qua AJAX
Xử lý lưu nội dung Excerpt khi AJAX gửi yêu cầu:
Mã: Chọn tất cả
// Lưu Excerpt qua AJAX
function save_excerpt_inline() {
if (!empty($_POST['post_id']) && isset($_POST['excerpt'])) {
$post_id = intval($_POST['post_id']);
$excerpt = sanitize_text_field($_POST['excerpt']);
if ($post_id) {
wp_update_post(array(
'ID' => $post_id,
'post_excerpt' => $excerpt,
));
wp_send_json_success();
}
}
wp_send_json_error();
}
add_action('wp_ajax_save_excerpt_inline', 'save_excerpt_inline');
Hoặc bạn có thể dùng luôn đoạn code tổng hợp này nếu ngại copy từng đoạn:
Mã: Chọn tất cả
// Thêm cột Excerpt vào danh sách bài viết
function add_excerpt_column($columns) {
$columns['excerpt'] = __('Mô tả ngắn', 'mh-magazine-lite');
return $columns;
}
add_filter('manage_posts_columns', 'add_excerpt_column');
// Hiển thị nội dung Excerpt trong cột
function show_excerpt_column_content($column_name, $post_id) {
if ($column_name === 'excerpt') {
$excerpt = get_post_field('post_excerpt', $post_id); // Lấy nội dung Excerpt
echo '<textarea class="inline-excerpt" data-post-id="' . esc_attr($post_id) . '" style="width: 100%; height: 50px;">' . esc_textarea($excerpt) . '</textarea>';
}
}
add_action('manage_posts_custom_column', 'show_excerpt_column_content', 10, 2);
// Thêm script để xử lý inline editing bằng AJAX
function add_excerpt_inline_edit_script() {
?>
<script>
document.addEventListener('DOMContentLoaded', function () {
const excerpts = document.querySelectorAll('.inline-excerpt');
let timeout = null; // Dùng để giới hạn số lần gọi AJAX
excerpts.forEach(function (excerptField) {
excerptField.addEventListener('blur', function () {
clearTimeout(timeout); // Xóa timeout cũ nếu có
timeout = setTimeout(() => { // Chỉ gọi AJAX sau khi người dùng dừng nhập liệu
const postId = this.dataset.postId;
const excerptValue = this.value;
const data = new FormData();
data.append('action', 'save_excerpt_inline');
data.append('post_id', postId);
data.append('excerpt', excerptValue);
fetch(ajaxurl, {
method: 'POST',
body: data,
})
.then(response => response.json())
.then(result => {
if (!result.success) {
console.error('Đã xảy ra lỗi khi lưu Excerpt.');
}
})
.catch(error => {
console.error('AJAX Error:', error);
});
}, 300); // Gọi AJAX sau 300ms
});
});
});
</script>
<?php
}
add_action('admin_footer', 'add_excerpt_inline_edit_script');
// Lưu Excerpt qua AJAX
function save_excerpt_inline() {
if (!empty($_POST['post_id']) && isset($_POST['excerpt'])) {
$post_id = intval($_POST['post_id']);
$excerpt = sanitize_text_field($_POST['excerpt']);
if ($post_id) {
wp_update_post(array(
'ID' => $post_id,
'post_excerpt' => $excerpt,
));
wp_send_json_success(); // Không trả về thông báo
}
}
wp_send_json_error();
}
add_action('wp_ajax_save_excerpt_inline', 'save_excerpt_inline');
Kết quả:
- Cột "Mô tả ngắn" sẽ xuất hiện trong danh sách bài viết.
- Bạn có thể chỉnh sửa nội dung trực tiếp trong ô nhập liệu.
- Nội dung tự động được lưu khi bạn rời khỏi ô nhập liệu, không cần tải lại trang.
Nếu có vấn đề gì trong quá trình thực hiện, bạn có thể phản hồi lại, mình sẽ hỗ trợ thêm!