AdvancedCustomFields / AdvancedCustomFields/acf

Custom Fields do not save when creating a new page

Open
#653 5 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
PHP
Stars
945
Forks
197
PR merge metrics
No merged PRs in 30d

Description

I have a custom field group that conditionally appears for pages that use a specific template. I do the following:

  1. Create a new page.
  2. Set the title.
  3. Set the template to the one set for the custom field group
  4. Set the value of one of the fields in the field group after it appears.
  5. 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
);

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the conditional custom-field workflow described in the issue, then start by comparing the metabox save behavior with WordPress's wp-admin/includes/post.php lines 2307-2309. Use the supplied JavaScript workaround as the reference case and verify that a field appearing after initial page load is saved when the page is published.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, php
Domain
content, web-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.