Função personalizada para reorganizar anexos ao criar postagens - Quase lá

4

Estou tendo alguns problemas com uma coisa personalizada que estou fazendo.

Eu implementei um uploader de imagens personalizado em um metabox em um tipo de postagem personalizado. Agora estou tentando descobrir uma maneira que me permita reordenar as imagens enviadas. Descobri que o jQuery Sortable seria uma maneira conveniente para o usuário poder apenas arrastar e soltar a ordem em que as imagens devem aparecer (no frontend estou usando um controle deslizante de imagem jQuery para mostrar as imagens e a ordem das imagens são decididos pelos dados de anexo "menu_order", então eu preciso de algum tipo de funcionalidade que salve o menu_order que eu crio com o jQuery Sortable.

Agora, este é um exemplo simplificado do que tenho: enlace

Juntamente com cada anexo, adicionei campos de entrada ocultos com o ID do anexo e um campo que abrigará a posição atual do anexo na ordem do menu.

O ID do anexo é facilmente obtido com o PHP básico WP ($ attachment- > ID). No entanto, ainda não encontrei uma maneira fácil de preencher o #att_order com o menu_order adequado. Então aqui eu gostaria de alguma ajuda / entrada se alguém fosse tão gentil.

Para salvar as informações reais, estou usando ajax para extrair os valores dos campos de entrada:

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 
    }
}

E, em seguida, use wp_update_post para atualizar os dados do anexo:

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

Estou ciente de que preciso de algum tipo de loop aqui, mas vou resolver isso.

Alguma idéia?

Obrigado

    
por INT 23.07.2011 / 13:18

1 resposta

5

Não sei bem quais são suas intenções para o código e, infelizmente, não achei o que você forneceu funcionou muito bem, então reescrevi partes do código fornecido para torná-lo uma solução mais viável.

Este código funcionará para salvar a ordem de anexos no metabox em save , não via ajax, mas, de forma realista, não há razão para salvar essas alterações em todo tipo (existe?).

Refatorizei o código para que você possa ajustar o tipo de postagem na parte superior do código. Eu não tenho certeza do que você está procurando com a chamada de enfileiramento, e tenho certeza que não pode ser chamado da maneira que você estava fazendo, nem era necessário na página do editor de postagens (classificável e os scripts necessários já estão disponíveis / carregado na tela do editor).

Dê uma olhada e veja como você se sai .. (note que esta é uma amostra de trabalho) ..

// 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;
}

Claro, certifique-se de mudar o valor do tipo de postagem, livro é o meu tipo de teste. :)

Se tiver alguma dúvida, adicione-a à sua pergunta original e, em seguida, envie um comentário para esta resposta. [/ p>     

por t31os 26.07.2011 / 12:45