web-dev-qa-db-fra.com

L'utilisation du nouveau code WP_Query en shortcode dans un champ personnalisé entraîne l'affichage du contenu principal de la publication

Je tente de répertorier un type de fichier personnalisé à l'aide d'un nouveau WP_Query.

Cela fonctionne bien lorsque j'ajoute le shortcode dans le contenu principal de l'article. Cependant, lorsque j'ajoute le shortcode à un champ personnalisé (que j'ai paramétré pour s'afficher sur la page avec le contenu principal en tant que "colonne" secondaire), le contenu principal disparaît!

Si je commente les lignes "while ... have_posts ()" et "endwhile", le contenu principal s'affiche; Cependant, même après avoir commenté toutes les autres lignes, le contenu principal disparaît à moins que je supprime également le "tant que".

Je suis presque certain que cela a à voir avec l'utilisation de WP_Query (en quelque sorte, elle détourne la boucle), même si cela ne devrait pas être le cas.

Y a-t-il quelque chose qui me manque?

Voici le shortcode:

   function ia_news_display_test($atts){ // [ia_news cat='category' num='numbertodisplay']

extract(shortcode_atts(array(
        'cat' => 'any',
        'num' => '2',
        ), $atts));

$dirloop = new wp_query( array( 
    'post_type' => 'ia_news', 
    'category_name' => $cat,
    'posts_per_page' => $num,
    'orderby' => 'menu_order',
    'order' => 'ASC'
));

if ($dirloop->have_posts()){
    $content = "<ul class='ia_news_list'>\n";
    while ( $dirloop->have_posts() ) : $dirloop->the_post();
        $custom = get_post_custom($post->ID);
        $file_id = $custom["upload_file"][0];
        $file_begin = $custom["begin_date"][0];
        $file_end = $custom["end_date"][0];
        if ('' != $file_end){$file_end = " to ".$file_end;}
        $file_url = wp_get_attachment_url($file_id);

            if ('' != $file_url) { //CHECK FOR EXISTENCE OF FILE URL
               $content .= "<li class='ia_nl'><a href='".$file_url."'>".$cat." ".$file_begin.$file_end."</a></li>\n";
            }
    endwhile;
    $content .= "</ul>\n";
} else { $content = "nothing"; }

return $content;

}

1
jfacemyer

Vous utilisez get_posts qui renvoie un tableau de publications que vous pouvez parcourir à l'aide de foreach, mais pas the_loop. Essayez cette version du code:

function ia_news_display_test($atts){ // [ia_news cat='category' num='numbertodisplay']

extract(shortcode_atts(array(
        'cat' => 'any',
        'num' => '2',
        ), $atts));

$dirloop = new WP_Query( array( 
    'post_type' => 'ia_news', 
    'category_name' => $cat,
    'posts_per_page' => $num,
    'orderby' => 'menu_order',
    'order' => 'ASC'
));

    if ($dirloop->have_posts())
    {
        $content = "<ul class='ia_news_list'>\n";
        while ( $dirloop->have_posts() ) : $dirloop->the_post();

            $file_id = get_post_meta(get_the_id(), "upload_file", true);
            $file_begin = get_post_meta(get_the_id(), "begin_date", true);
            $file_end = get_post_meta(get_the_id(), "end_date", true);

            if ('' != $file_end)
            {
                $file_end = " to ".$file_end;
            }
            $file_url = wp_get_attachment_url($file_id);

            if ('' != $file_url) 
            {   
                //CHECK FOR EXISTENCE OF FILE URL
                $content .= "<li class='ia_nl'><a href='".$file_url."'>".$cat." ".$file_begin.$file_end."</a></li>\n";
            }
        endwhile;
        $content .= "</ul>\n";
    } 
    else
    { 
        $content = "nothing";
    }
    wp_reset_postdata();

    return $content;
}

add_shortcode('ia_news_test', 'ia_news_display_test');

De plus, si votre nom de champ personnalisé est upload_file, essayez alors d'utiliser get_post_meta au lieu de faire une coupe longue comme le fait votre code.

4
Rutwick Gangurde

Vous devez utiliser wp_reset_postdata() avant de quitter la fonction. Identique à wp_reset_query(), mais restaure le $post global au lieu de $wp_the_query.

0
helenhousandi