Usando el bucle dentro de admin

2

Tengo el siguiente problema:

Estoy creando una meta-caja personalizada para que el usuario agregue campos personalizados de manera amigable.
Quiero generar un cuadro desplegable con todas las publicaciones incluidas en la categoría 10.
He creado un bucle dentro del archivo de funciones para recuperar las publicaciones que quiero y para crear una lista de selección desplegable.

Entonces, cuando vaya a admin - > Publicaciones y seleccione una publicación para editar, obtengo el siguiente problema:
La última publicación se cargará sin importar cuál seleccione.

Aquí está el código usado dentro del archivo de funciones y luego se llama cuando se genera el código html para el meta-cuadro personalizado:

function get_project_ids($proj_cat = 10) {

$output = '';

$catt = get_categories('parent='.$proj_cat.'&hide_empty=0');

    foreach ($catt as $c) :

        $output .= '<optgroup label="'.$c->name.'">';
        $d = get_categories('parent='.$c->cat_ID.'&hide_empty=0');

            foreach ($d as $e) :
            $output .= '<optgroup label="'.$e->name.'">';

                $args = array( 'nopaging' => true, 'cat' => $e->cat_ID );
                $project_query = new WP_Query( $args );

                    while ( $wp_query->have_posts() ) : $wp_query->the_post();
                        $project_id = (get_post_meta($post->ID, 'project_code', true) != "")?get_post_meta($post->ID, 'project_code', true):"";
                        $output .= '<option value="'.$post->ID.'">'.$project_id.'-'.get_the_title().'</option>';    
                    endwhile; 

                wp_reset_postdata();
                $wp_query = null;
                $wp_query = $original_query;

            $output .= '</optgroup> <!-- END level-b -->';
        endforeach;

        $output .= '</optgroup> <!-- END level-a -->';
    endforeach;

return $output;
    
pregunta ion 03.07.2011 - 22:12

4 respuestas

4

No estoy seguro del problema, pero mi consejo sería intentar refactorizar esto para usar get_posts() y etiquetas de plantilla que puedan funcionar sin la variable global $post . Básicamente no toques globales en absoluto.

Los bucles en el front-end son casi civilizados hoy en día, pero los aspectos internos de admin son todavía muy salvajes. :)

    
respondido por el Rarst 04.07.2011 - 12:02
3

Estás creando una nueva consulta, llamada $project_query , y luego nunca la usas.

Luego estás usando $wp_query , para el cual no hay una declaración global $wp_query; .

Entonces estás asignando nulo a $wp_query y luego asignándole el valor de una variable no definida.

En su lugar, elimine las dos líneas innecesarias y use $project_query en su lugar. Aquí está el bucle de consulta modificado:

            $args = array( 'nopaging' => true, 'cat' => $e->cat_ID );
            $project_query = new WP_Query( $args );

                while ( $project_query ->have_posts() ) : $project_query ->the_post();
                    $project_id = (get_post_meta($post->ID, 'project_code', true) != "")?get_post_meta($post->ID, 'project_code', true):"";
                    $output .= '<option value="'.$post->ID.'">'.$project_id.'-'.get_the_title().'</option>';    
                endwhile; 

            wp_reset_postdata();
    
respondido por el Tom J Nowell 14.02.2012 - 12:57
2

Este es el código de trabajo:

global $post;
$tmp_post = $post;
$args = array( 'numberposts' => 10000, 'category' => $e->cat_ID );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post);
    $project_id = (get_post_meta($post->ID, 'project_code', true) != "")?get_post_meta($post->ID, 'project_code', true):"";
    $output .= '<option value="'.$post->ID.'">'.$project_id.'-'.get_the_title().'</option>';    
endforeach;
$post = $tmp_post;
    
respondido por el ion 05.07.2011 - 02:02
0

Encontré esta pregunta, revisé las respuestas, pero tuve que hacer una combinación porque quería usar WP_Query, Y aún tenía problemas en el panel de administración.

Este código funciona correctamente para mí en un metabox al editar publicaciones:

function custom_metabox() {
    global $post;
    $temp_post = $post;

    $args = array(
        'post_type'  => 'custom_post_type',
        'meta_key'   => '_custom_meta_key',
        'meta_value' => TRUE
    );

    $custom = new WP_Query( $args );

    if ( $custom->have_posts() ) {
        while ( $custom->have_posts() ) {
            $custom->the_post();
            // ... with access to the data with functions like get_the_ID(), get_the_title(), etc.
        }

        wp_reset_postdata();
    }

    $post = $temp_post;

    // ... the rest of my metabox ...
}

NOTA: Sin el global $post , $temp_post = $post y $post = $temp_post , todavía estaba teniendo problemas con la bala y el fragmento fue sobrescrito. Al agregar esos bits de código, esto parece estar funcionando de manera sólida ahora.

    
respondido por el cale_b 20.10.2015 - 21:59

Lea otras preguntas en las etiquetas