web-dev-qa-db-fra.com

Meilleure pratique, fonction personnalisée, où faire écho aux variables?

J'ai une fonction personnalisée pour interroger certains messages. Je me demandais s'il était acceptable de faire écho à des variables dans la boucle de la fonction, car normalement, je ferais l'écho d'une variable à la fin de la fonction. Si tel est le cas, comment stocker correctement plusieurs valeurs dans cette variable?

Voir exemple de code ci-dessous:

<?php 
function get_some_posts($args) { 
        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();
                //Can i echo variables here?
                get_template_part( 'parts/content-item', get_post_type() );

                //Or should i put it into a variable and if so how? Since the below is not working.
                $to_echo = get_template_part( 'parts/content-item', get_post_type() );
            }

        }
        //And then echo it at the end of the function?
        echo $to_echo;
}
add_action('custom_hook','get_some_posts');
2
RobbTe

Généralement parlant, oui. Si votre sortie normale devait faire écho à la fin, l'écho pendant la boucle ne changerait pas beaucoup.

function get_some_posts($args) { 
        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();
                the_title(); // the_title() is the same as echo get_the_title();
            }

        }
}
add_action('custom_hook','get_some_posts');

La sortie de ce qui précède devrait être la même que la sortie ci-dessous:

function get_some_posts($args) { 
        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            // declare your variable to avoid php output errors
            $to_echo = '';

            while ( $query->have_posts() ) {

                $query->the_post();

                $to_echo .= get_the_title(); // ".=" adds to the current value of the variable.
            }

        }
        //And then echo it at the end of the function?
        echo $to_echo;
}
add_action('custom_hook','get_some_posts');

Bien sûr, je travaille directement sur le code de votre question. Cela manque un peu de contexte et vous voudriez également appliquer une sorte d'espace ou de saut de ligne entre les titres.

En guise d’exemple pratique, et votre question à propos de pas en écho dans The Loop, voici une possibilité à titre d’exemple:

add_filter( 'the_content', 'get_some_posts' );
function get_some_posts( $content ) { 

    if ( is_single() ) {

        $query = new WP_Query( array( 'post_type' => 'page' ) );

        if ( $query->have_posts() ) {

            // declare your variable to avoid php output errors
            $to_echo = '';

            while ( $query->have_posts() ) {

                $query->the_post();

                $to_echo .= get_the_title() . "<br />";
            }

        }

        $content = $content . "<p>Checkout some pages:</p>" . $to_echo;
    }

    return $content;
}

Cela prendrait votre "théorie" et l'appliquerait au filtre "the_content" de WP qui filtre la zone de contenu principale. Il vérifie d'abord si nous sommes sur un seul post, et si c'est le cas, lance une requête pour obtenir des pages. Il place les titres de ces pages dans une liste, y ajoute du texte, puis pointe sur la variable $ content (passant par le filtre) avant de renvoyer le résultat.

Ce n’est pas un exemple du "monde réel" en termes d’utilisation finale, car je n’ai pas inclus de liens, mais uniquement des titres, et il n’est pas limité en nombre, ce qui pourrait être une quantité ridicule de contenu supplémentaire. C'est simplement ici à titre d'exemple pour votre question de "comment" pouvez-vous prendre un résultat de WP_Query et le renvoyer. C'est donc un exemple de ce que les "filtres" font (ou pourraient faire). Si c'était une action, alors ce serait différent. Vous devez soit le répercuter dans la fonction OR, le placer dans une variable déclarée globale et le sélectionner dans une action/un filtre ultérieur.

1
butlerblog