如何将内置的AJAX绑定到一个Add_action?

时间:2016-09-16 作者:Ian

请在我的函数中考虑以下代码。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);
我想做的是允许上传多个Word文档,但让用户选择“最新”版本。通过在附件上使用自定义元字段,此代码可以很好地实现这一点。然而,在管理界面中,Wordpress喜欢通过AJAX进行保存,AJAX保存但不重新加载其他附件元,这是必需的功能。所以现在我真的想wp_ajax_save-attachment-compat 筛选,运行AJAX请求以更新视图中的附件。我找到了AJAX操作“查询附件”,然后在JS方法中使用它Attachments.sync, 但我真的很难找到一种方法来把它们联系在一起?

干杯

1 个回复
最合适的回答,由SO网友:Ian 整理而成

我找到了一种解决方法,不使用JS方法本身,而是基本上监听它们附加的AJAX调用并从中获取。这是我最后的密码。我用了QueryStringToHash 列出的功能here 首先解析发送的数据,并使用它来确定是否要继续刷新媒体帧内容视图。这是在this 邮递此方法的一个缺点是,一旦执行此操作,媒体库将不再自动更新新的上载。

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
}
也许有更好的方法可以将这个脚本排队,但实际上,正如上面@Svetoslav Marinov所评论的那样,也许有更好的方法可以解决我的问题,而不需要包含元数据,所以这项工作就交给了剪辑室。希望有人觉得它有用。

相关推荐

尝试在WordPress中实现AJAX注释,遇到WP错误

我试图在WordPress中为我的评论实现Ajax,使用this tutorial. 但我在将教程中的代码集成到自己的预构建主题时遇到了问题。问题是,我要么得到一个WP错误“检测到重复注释;看来你已经说过了!”或标准500错误。以下是我得到的:下面是我对ajax的评论。js文件如下所示: * Let\'s begin with validation functions */ jQuery.extend(jQuery.fn, { /* * check i