创建帖子时重新排列附件的自定义功能-几乎就在那里

时间:2011-07-23 作者:INT

我在做一件定制的事情时遇到了一些麻烦。

我已经在自定义post类型中将自定义图像上传器实现到metabox中。现在,我正试图找到一种方法,让我重新排序上传的图像。我发现jQuery Sortable是一种方便的方式,用户可以拖放图像的显示顺序(在前端,我使用jQuery图像滑块显示图像,图像的顺序由附件数据“menu\\u order”决定),因此我需要一些功能来保存我用jQuery Sortable创建的menu\\u顺序。

现在,这是一个简化的示例:http://jsfiddle.net/LN4sA/

与每个附件一起,我添加了带有附件id的隐藏输入字段和一个将在菜单顺序中容纳附件当前位置的字段。

使用基本WP PHP(附件->ID)可以轻松获取附件的ID。然而,我还没有找到一种简单的方法来用正确的menu\\u顺序填充#att\\u顺序。因此,如果有人愿意的话,我希望得到一些帮助/意见。

为了保存实际信息,我使用ajax从输入字段中提取值:

add_action(\'save_post\', \'save_attachment_position\');
function save_attachment_position(){
    global $post;
    if ($post->post_type == \'work\') { ?>
        <script type="text/javascript">
        //<![CDATA[
            jQuery.ajax({
                type: \'post\',
                url: ajaxurl,
                data: {
                    action: \'order_attachment\',
                    att_ID: jQuery(this).parents(\'.attachment\').find(\'#att_id\').val(),
                    att_order: jQuery(this).parents(\'.attachment\').find(\'#att_order\').val(),
                    _ajax_nonce: jQuery(\'#ordernonce\').val(),
                    post_type: \'attachment\'
                }
            });
        //]]>
    </script><?php 
    }
}
然后使用wp\\u update\\u post更新附件数据:

add_action(\'wp_ajax_order_attachment\', \'order_attachment\');
function order_attachment($post) {
    $attachmentdata = array();
    $attachmentdata[\'ID\'] = $_POST[\'att_ID\'];
    $attachmentdata[\'menu_order\'] = $_POST[\'att_order\'];
    wp_update_post($attachmentdata);    
}
我知道我需要某种循环,但我会解决的。

有什么想法吗?

谢谢

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

我不完全确定您对代码的意图是什么,不幸的是,我没有发现您提供的工作得很好,所以我重写了提供的部分代码,以使其成为更可行的解决方案。

此代码用于将附件订单保存在save, 不是通过ajax,但实际上没有理由在每种类型上保存这些更改(有吗?)。

我重构了代码,以便您可以调整代码顶部的post类型。我不确定您使用enqueue调用的目的是什么,也很确定它不能以您的方式调用,也不需要在post editor页面上调用(可排序和必要的脚本已经在编辑器屏幕上可用/加载)。

试一试,看看你过得怎么样。。(请注意,这是一个工作示例)。。

// Not applicable to my testing, but left it in because i\'m sure it\'s appropriate to your usage
add_theme_support( \'post-thumbnails\' );
add_image_size( \'editor-thumb\', 130, 72, true );

// Quicker to update one line than several, only reason it\'s defined here
$my_post_type = \'book\';

// Add metabox on the proper metabox hook
add_action( \'add_meta_boxes_\' . $my_post_type, \'add_image_sortable_box\',   2000 );

// Fire jQuery only on the appliable pages
add_action( \'admin_footer-post.php\',           \'add_sortable_to_elements\', 2000 );
add_action( \'admin_footer-post-new.php\',       \'add_sortable_to_elements\', 2000 );

function add_image_sortable_box() {
    global $my_post_type;
    add_meta_box( \'test-image-thing\', \'Sortable Attachments Test\', \'do_image_metabox_thingy\', $my_post_type, \'side\', \'default\' );
}

function add_sortable_to_elements() { 
    ?>
    <script type="text/javascript">
    //<![CDATA[
        jQuery(document).ready(function($) {
            $(\'#attachmentcontainer\').sortable();   
        });
    //]]>
    </script>
    <?php
}

function do_image_metabox_thingy( $p ) { 

    // No global statement needed here, the hook this function is attached to gives you the post object

    $args = array(
        \'order\'          => \'asc\',
        \'orderby\'        => \'menu_order\',
        \'post_type\'      => \'attachment\',
        \'post_parent\'    => $p->ID,
        \'post_mime_type\' => \'image\',
        \'post_status\'    => null,
        \'numberposts\'    => -1,
    );

    $attachments = get_posts( $args );

    if( $attachments ) :

        // Only need 1 nonce to cover the lot
        wp_nonce_field( \'my_attachment_sort\', \'attachment_sort_nonce\' );
    ?>

    <div class="imageuploader">
        <div id="attachmentcontainer">

        <?php
        foreach( $attachments as $attachment ) :
            $attachmentid = $attachment->ID;
            $editorimage = wp_get_attachment_image_src( $attachment->ID, \'editor-thumb\', false, false);
        ?>

            <div class="attachment" id="test-<?php echo $attachment->ID; ?>">
                <div class="image">
                    <img width="100" height="auto" src="<?php echo $editorimage[0]; ?>" />
                    <input type="hidden" name="att_id[]" id="att_id" value="<?php echo $attachment->ID; ?>" />
                </div>
            </div>

        <?php 
        endforeach;
        ?>

        <div style="clear: both;"></div>
        </div>      
    </div>

    <?php
    endif;
}

// Updates the attachments when saving
add_filter( \'wp_insert_post_data\', \'test_meta_save\', 1000, 2 );

function test_meta_save( $data, $_post_vars ) {
    global $my_post_type;
    if( $my_post_type != $data[\'post_type\'] || !isset( $_post_vars[\'attachment_sort_nonce\'] ) )
        return $data;

    if( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE )
        return $data;

    if( !wp_verify_nonce( $_post_vars[\'attachment_sort_nonce\'], \'my_attachment_sort\' ) )
        return $data;

    global $post_ID;

    if( !current_user_can( \'edit_post\', $post_ID ) ) 
        return $data;

    if( isset( $_post_vars[\'att_id\'] ) ) {
        foreach( $_post_vars[\'att_id\'] as $img_index => $img_id ) {
            $a = array(
                \'ID\' => $img_id,
                \'menu_order\' => $img_index
            );
            wp_update_post( $a );
        }
    }
    return $data;
}
当然,一定要切换帖子类型值,book是我的测试帖子类型:)

如果有任何问题,请将其添加到原始问题中,然后在此答案上留言让我知道。。

结束