Función personalizada para reorganizar los archivos adjuntos al crear publicaciones - Casi allí

4

Estoy teniendo problemas con una cosa personalizada que estoy haciendo.

He implementado un cargador de imágenes personalizado en un metabox en un tipo de publicación personalizada. Ahora estoy tratando de encontrar una manera que me permita reordenar las imágenes cargadas. Descubrí que jQuery Sortable sería una forma conveniente para que el usuario solo pudiera arrastrar y soltar en el orden en que deberían aparecer las imágenes (en la parte delantera, estoy usando un control deslizante de imágenes de jQuery para mostrar las imágenes y el orden de las imágenes se deciden por los datos adjuntos "menu_order", por lo que necesito algún tipo de funcionalidad que guarde el menu_order que creo con jQuery Sortable.

Ahora, este es un ejemplo simplificado de lo que tengo: enlace

Junto con cada archivo adjunto, he agregado campos de entrada ocultos con el ID del archivo adjunto y un campo que albergará la posición actual del archivo adjunto en el orden del menú.

El ID del adjunto se puede obtener fácilmente con WP PHP básico ($ attachment- > ID). Sin embargo, todavía no he encontrado una manera fácil de rellenar el #att_order con el menu_order adecuado. Así que aquí me gustaría algo de ayuda / aportación si alguien fuera tan amable.

Para guardar la información real, estoy usando ajax para extraer los valores de los 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 
    }
}

Y luego use wp_update_post para actualizar los datos adjuntos:

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

Soy consciente de que necesito algún tipo de bucle aquí, pero lo resolveré.

¿Alguna idea?

Gracias

    
pregunta INT 23.07.2011 - 13:18

1 respuesta

5

No estoy completamente seguro de cuáles son sus intenciones para el código, y desafortunadamente no encontré que lo que proporcionó funcionó muy bien, por lo que reescribí partes del código suministrado para convertirlo en una solución más viable.

Este código funcionará para guardar el orden de los archivos adjuntos en el metabox en save , no a través de ajax, pero en realidad no hay razón para guardar esos cambios en todos los tipos (¿existe?).

He refactorizado el código para que puedas ajustar el tipo de publicación en la parte superior del código. No estoy seguro de cuál es su objetivo con la llamada en cola, y bastante seguro de que no se puede llamar de la forma en que lo estaba haciendo, ni tampoco fue necesario en la página del editor de publicaciones (se puede ordenar y las secuencias de comandos necesarias ya están disponibles / cargado en la pantalla del editor).

Pruebe esto y vea cómo le va ... (tenga en cuenta que es una muestra funcional) ..

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

Por supuesto, asegúrese de cambiar el valor del tipo de publicación, el libro es mi tipo de publicación de prueba ... :)

Cualquier pregunta, agréguelas a su pregunta original, luego suelte un comentario en esta respuesta para hacerme saber ...

    
respondido por el t31os 26.07.2011 - 12:45

Lea otras preguntas en las etiquetas