AdvancedCustomFields / AdvancedCustomFields/acf
Custom Fields do not save when creating a new page
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- PHP
- Star
- 945
- Fork
- 197
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
I have a custom field group that conditionally appears for pages that use a specific template. I do the following:
- Create a new page.
- Set the title.
- Set the template to the one set for the custom field group
- Set the value of one of the fields in the field group after it appears.
- Publish the page.
If I then refresh the editor page or view the published page, the value set in the field has not been saved.
I dug into this a bit and discovered that WordPress caches the added metaboxes on initial page load and does not check again when publishing. So, if there were no metaboxes when first creating the page, it will not attempt to save any metaboxes when publishing. ACF appears to do the correct thing and register the metaboxes when the conditions are met, but a bug in WordPress (which they may or may not want to fix) does not detect the newly added metaboxes.
To work around this for right now, I basically duplicated the code from WordPress and updated it to check if there are metaboxes every time it detects a save was just requested:
(function (
external_wp_data_,
external_wp_editor_
) {
/*
CUSTOMIZATION: MODIFICATION
ORIGINAL:
let wasSavingPost = yield external_wp_data_["controls"].select(external_wp_editor_["store"], 'isSavingPost');
let wasAutosavingPost = yield external_wp_data_["controls"].select(external_wp_editor_["store"], 'isAutosavingPost');
const hasMetaBoxes = yield external_wp_data_["controls"].select(store, 'hasMetaBoxes'); // Save metaboxes when performing a full save on the post.
NEW:
*/
let wasSavingPost = Object(external_wp_data_["select"])(external_wp_editor_["store"]).isSavingPost();
let wasAutosavingPost = Object(external_wp_data_["select"])(external_wp_editor_["store"]).isAutosavingPost();
/* CUSTOMIZATION: END */
Object(external_wp_data_["subscribe"])(() => {
const isSavingPost = Object(external_wp_data_["select"])(external_wp_editor_["store"]).isSavingPost();
const isAutosavingPost = Object(external_wp_data_["select"])(external_wp_editor_["store"]).isAutosavingPost(); // Save metaboxes on save completion, except for autosaves that are not a post preview.
//
// Meta boxes are initialized once at page load. It is not necessary to
// account for updates on each state change.
//
// See: https://github.com/WordPress/WordPress/blob/5.1.1/wp-admin/includes/post.php#L2307-L2309
/*
CUSTOMIZATION: MODIFICATION
ORIGINAL:
const shouldTriggerMetaboxesSave = hasMetaBoxes && wasSavingPost && !isSavingPost && !wasAutosavingPost; // Save current state for next inspection.
NEW:
*/
const shouldTriggerMetaboxesSave = (
wasSavingPost
&&
!isSavingPost
&&
!wasAutosavingPost
&&
Object(external_wp_data_["select"])(wp.editPost["store"]).hasMetaBoxes()
);
/* CUSTOMIZATION: END */
wasSavingPost = isSavingPost;
wasAutosavingPost = isAutosavingPost;
if (shouldTriggerMetaboxesSave) {
Object(external_wp_data_["dispatch"])(wp.editPost["store"]).requestMetaBoxUpdates();
}
});
})(
window.wp.data,
window.wp.editor
);
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Tái hiện workflow của custom-field có điều kiện được mô tả trong issue, sau đó bắt đầu bằng cách so sánh hành vi lưu của metabox với các dòng 2307-2309 trong wp-admin/includes/post.php của WordPress. Sử dụng JavaScript workaround được cung cấp làm trường hợp tham chiếu và xác minh rằng một field xuất hiện sau lần tải trang ban đầu được lưu khi trang được publish.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, php
- Lĩnh vực
- content, web-dev
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 38/100