AdvancedCustomFields / AdvancedCustomFields/acf

Custom Fields do not save when creating a new page

Abierto
#653 5 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
PHP
Estrellas
945
Forks
197
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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
);

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Reproduce el flujo de trabajo de campos personalizados condicionales descrito en el issue y, a continuación, empieza comparando el comportamiento de guardado de la metabox con las líneas 2307-2309 de wp-admin/includes/post.php de WordPress. Usa la solución alternativa proporcionada en JavaScript como caso de referencia y verifica que un campo que aparece después de la carga inicial de la página se guarda cuando se publica la página.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, php
Área
content, web-dev
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
38/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.