Como amarrar o AJAX em um add_action?

4

Por favor, considere o seguinte código no meu arquivo 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);

O que estou tentando fazer é permitir que vários documentos do Word sejam enviados, mas que o usuário selecione uma versão "mais recente". Esse código funciona bem em conseguir isso usando um meta campo personalizado no anexo. No entanto, na interface de administração, o Wordpress gosta de salvar à medida que passa pelo AJAX, que salva, mas não recarrega, outras metas de anexo, que é a funcionalidade necessária. Então, agora eu quero efetivamente, na parte inferior do meu filtro wp_ajax_save-attachment-compat , executar uma solicitação AJAX para atualizar meus anexos na exibição. Eu encontrei a ação AJAX "anexos de consulta", que é então usado no método JS Attachments.sync , mas eu estou realmente lutando para encontrar uma maneira de amarrá-los juntos?

Felicidades

    
por Ian 16.09.2016 / 23:33

1 resposta

2

Encontrei uma maneira de contornar isso, não usando os métodos JS, mas basicamente ouvindo as chamadas AJAX anexadas e tirando-as de lá. Este foi o meu código final. Eu usei a função QueryStringToHash listada aqui para analisar os dados enviados em primeiro lugar e usá-los para determinar se Eu queria prosseguir com a atualização da exibição de conteúdo do quadro de mídia. Isso foi conseguido com a ajuda do presente post. A única desvantagem desse método é que, uma vez que isso tenha sido executado, a biblioteca de mídia não será mais atualizada automaticamente com novos uploads.

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
}

Provavelmente existem maneiras melhores de enfileirar esse script, mas, na verdade - como comentou @Svetoslav Marinov acima -, talvez haja formas melhores de resolver meu problema sem a inclusão de metadados, portanto, este trabalho está resignado ao plenário da sala de corte. Espero que alguém ache útil.

    
por Ian 23.09.2016 / 15:34

Tags