it-swarm.com.de

Verwenden Sie die Schleife in admin

Ich habe folgendes Problem:

Ich erstelle eine benutzerdefinierte Meta-Box für den Benutzer, um benutzerdefinierte Felder auf benutzerfreundliche Weise hinzuzufügen.
Ich möchte ein Dropdown-Feld mit allen Beiträgen erstellen, die unter Kategorie 10 fallen.
Ich habe eine Schleife in der Funktionsdatei erstellt, um die gewünschten Beiträge abzurufen und eine Dropdown-Auswahlliste zu erstellen.

Wenn ich also zu admin -> posts gehe und einen Beitrag zum Bearbeiten auswähle, erhalte ich das folgende Problem:
Der letzte Beitrag wird geladen, egal welchen ich auswähle.

Hier ist der Code, der in der Funktionsdatei verwendet und dann beim Generieren des HTML-Codes für die benutzerdefinierte Meta-Box aufgerufen wird:

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;
3
ion

Ich bin mir nicht sicher, aber mein Rat wäre, dies zu überarbeiten, um get_posts()- und Template-Tags zu verwenden, die ohne die globale Variable $post funktionieren. Grundsätzlich keine Globals anfassen.

Loops im Front-End sind heutzutage fast zivilisiert, aber Interna von admin sind immer noch sehr wild. :)

4
Rarst

Sie erstellen eine neue Abfrage mit dem Namen $project_query und verwenden sie dann nie.

Dann verwenden Sie $wp_query, für den es keine global $wp_query;-Anweisung gibt.

Dann weisen Sie $wp_query den Wert null zu und weisen ihm dann den Wert einer undefinierten Variablen zu.

Entfernen Sie stattdessen die beiden unnötigen Zeilen und verwenden Sie stattdessen $project_query. Hier ist die modifizierte Abfrageschleife:

            $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();
3
Tom J Nowell

Dies ist der Arbeitscode:

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;
2
ion

Fand diese Frage, überprüfte die Antworten, musste aber eine Kombination durchführen, weil ich die WP_Query verwenden wollte, und hatte immer noch Probleme im Admin-Dashboard.

Dieser Code funktioniert bei mir in einer Metabox beim Bearbeiten von Beiträgen ordnungsgemäß:

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

HINWEIS: Ohne den global $post, den $temp_post = $post und den $post = $temp_post hatte ich immer noch Probleme mit dem Slug und dem Auszug, die überschrieben wurden. Durch das Hinzufügen dieser Codebits scheint dies jetzt solide zu funktionieren.

1
cale_b