¿Cómo vincular el AJAX integrado a un add_action?

4

Tenga en cuenta el siguiente código en mi archivo functions.php:

add_filter( 'attachment_fields_to_edit', function($form_fields, $post){
    $post_mime_type = (
        get_post_mime_type( $post ) == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||
        get_post_mime_type( $post ) == 'application/msword'
        ) ? 1 : 0;
    if ( $post_mime_type == 1) {
    $ilm = get_post_meta( $post->ID, 'is_latest', true );
    $checked = ($ilm == "1" ? 'checked="checked"' : '');
    $form_fields['is_latest'] = array(
      'label' => '<b">Latest?</b>',
      'input' => 'html',
      'html'  => "<input type=\"checkbox\"
        name=\"attachments[{$post->ID}][is_latest]\"
        id=\"attachments[{$post->ID}][is_latest]\"
        value=\"1\" {$checked}/><br />");
                return $form_fields;
    }
}, null, 2 );

add_filter("attachment_fields_to_save", function($post, $attachment){
  if($attachment['is_latest'] == "1") {
        $args = array( 'post_type' => 'attachment');
    $attachments = get_posts( $args );
    if ( $attachments ) {
      foreach ( $attachments as $a ) {
            update_post_meta($a->ID, 'is_latest', 0);
        }
    }
    update_post_meta($post['ID'], 'is_latest', 1);
  } else {
    update_post_meta($post['ID'], 'is_latest', 0);
  }
}, null , 2);


add_filter("wp_ajax_save-attachment-compat", function(){

    $post_id = $_POST['id'];

    if(($_POST['attachments'][$post_id]['is_latest']) == "1") {
        $args = array( 'post_type' => 'attachment');
        $attachments = get_posts( $args );
        if ( $attachments ) {
          foreach ( $attachments as $a ) {
             update_post_meta($a->ID, 'is_latest', 0);
          }
        }
        update_post_meta($post_id, 'is_latest', 1);
    } else {
        update_post_meta($post_id, 'is_latest', 0);
    }

    clean_post_cache($post_id);

  }, 1, 0);

Lo que estoy tratando de hacer es permitir que se carguen varios documentos de Word, pero para que el usuario seleccione una versión "más reciente". Este código funciona bien para lograrlo mediante el uso de un meta campo personalizado en el archivo adjunto. Sin embargo, en la interfaz de administración, a Wordpress le gusta guardar a medida que avanza a través de AJAX, que guarda pero no vuelve a cargar otras metas de archivos adjuntos, que es la funcionalidad requerida. Así que ahora, efectivamente, quiero, en la parte inferior de mi filtro wp_ajax_save-attachment-compat , ejecutar una solicitud AJAX para actualizar mis archivos adjuntos a la vista. He encontrado la acción AJAX "archivos adjuntos de consulta" que luego se usa en el método JS Attachments.sync , pero estoy realmente luchando para encontrar una manera de cómo vincularlos.

Saludos

    
pregunta Ian 16.09.2016 - 23:33

1 respuesta

2

Encontré una forma de evitar esto al no usar los métodos JS en sí mismos, sino básicamente escuchar sus llamadas AJAX adjuntas y tomarlas desde allí. Este fue mi código final. Utilicé la función QueryStringToHash enumerada aquí para analizar los datos enviados en primer lugar, y usar esto para determinar si Quería continuar con la actualización de la vista de contenido del marco de medios. Esto se logró con la ayuda de esta publicación . La única desventaja de este método es que una vez que se haya ejecutado, la biblioteca de medios ya no se actualizará automáticamente con nuevas cargas.

functions.php

add_action('admin_footer-post.php', 'reload_attachments');
add_action('admin_footer-post-new.php', 'reload_attachments');

function reload_attachments() {
    ?>
    <script>
        jQuery(function($) {
            $('#wpcontent').ajaxComplete(function(a,b,c) {
                var input = QueryStringToHash(c.data);
                if (input.action == "save-attachment" || input.action == "save-attachment-compat") {
                     if (wp.media.frame.content.get()!==null) {
                        wp.media.frame.content.get().collection.props.set({ignore: (+ new Date())});
                        wp.media.frame.content.get().options.selection.reset();
                     } else {
                        wp.media.frame.library.props.set({ignore: (+ new Date())});
                     }
                }
            });
        });
    </script>
    <?php
}

Probablemente hay mejores formas de poner en cola este guión, pero en realidad, como comenta anteriormente @Svetoslav Marinov, quizás haya mejores formas de resolver mi problema sin la inclusión de metadatos, por lo que este trabajo se resigna a la sala de despiece. Esperemos que alguien lo encuentre útil.

    
respondido por el Ian 23.09.2016 - 15:34

Lea otras preguntas en las etiquetas