web-dev-qa-db-fra.com

Ignorer les résultats de la requête globale sans crochets

J'ai une page php personnalisée et je dois remplacer les variables de messages globales, mais je ne peux pas le faire fonctionner. En passant par la boucle principale, je ne peux pas écraser les posts globaux, mais je ne peux pas écraser ce que have_posts () utilise pour obtenir le compte. J'obtiens des données à partir d'une API tierce et je dois donc créer l'objet WP à la volée, puis remplacer les objets par défaut renvoyés par la requête par défaut. J'ai le code suivant et son fonctionnement, mais le problème est que j'obtiens un résultat contenant la publication, puis plusieurs objets nuls par la suite.

require_once('../../../wp-blog-header.php');

global $post, $posts, $found_posts, $post_count;

$post->ID = 99999999999;
$post->post_content = "TEST PAGE content";
$post->post_title = "Page Title";
$post->post_name = "test";

$posts = array($post);
$post_count = 1;
$found_posts = 1;

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post(); 
        var_dump($post);
    }
}

Le code ci-dessus génère la sortie suivante. Je dois me débarrasser des NULL. Pour ce faire, je dois le faire de manière à ce que have_posts () ne renvoie vrai qu'une seule fois.

objet (WP_Post) # 2975 (24) {["ID"] => int (99999999999) ["post_author"] => chaîne (1) "1" ["post_date"] => chaîne (19) "2016-01 -21 19:50:24 "[" post_date_gmt "] => chaîne (19)" 2016-01-21 19:50:24 "[" post_content "] => chaîne (17)" Contenu de la page TEST "[" post_title "] => string (10)" Titre de la page "[" post_excerpt "] => string (0)" "[" post_status "] => string (7)" publish "[" comment_status "] => string (6) "fermé" ["ping_status"] => string (6) "fermé" ["post_password"] => string (0) "" ["post_name"] => string (4) "test" ["to_ping"] = > string (0) "" ["pinged"] => string (0) "" ["post_modified"] => string (19) "2016-01-21 19:50:24" ["post_modified_gmt"] => string (19) "2016-01-21 19:50:24" ["post_content_filtered"] => string (0) "" ["post_parent"] => int (0) ["guid"] => string (36 ) "" ["menu_order"] => int (0) ["post_type"] => chaîne (4) "page" ["post_mime_type"] => chaîne (0) "" ["commentaire_compte"] => chaîne ( 1) "0" ["filtre"] => chaîne de caractères (3) "raw"} NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

1
Dan Hastings

J'ai trouvé la solution à cela dans la variable $ wp_query. En obtenant la variable globale pour cela et en remplaçant les valeurs qu’elle contient, j’ai pu contrôler totalement ce qui est affiché sur la page. Cela me permettait de générer un objet de publication WP provenant d'une base de données en dehors de WordPress, mais je n'avais rien à faire pour le rendre affiché.

Voici un guide complet qui explique comment faire http://yomotherboard.com/how-to-add-a-custom-php-page-to-wordpress-using-a- plugin/

0
Dan Hastings

Il est assez difficile de comprendre ce que vous devez faire ici, mais vous devez regarder ce qui suit

  • N'utilisez pas les variables globales en tant que variables locales, cela casse les variables globales et provoque des problèmes avec la boucle. Il est également assez difficile de déboguer lorsque vous rencontrez des problèmes. La seule variable globale devant être utilisée en tant que variable locale est lorsque vous travaillez avec setup_postdata(). setup_postdata() requiert le $post global. Vous devez juste vous rappeler de réinitialiser le $post global après.

  • Utilisez les actions et les filtres disponibles dans WP_Query pour modifier le résultat d'un objet de requête spécifique.

En général, la propriété $post_count est calculée à partir du nombre de publications dans $posts. Juste avant que les messages ne soient comptés, nous obtenons le filtre the_posts. Cela nous permet d’ajouter/supprimer des objets de publication ( ou de réorganiser l’ordre de publication ) du tableau $posts. Toute modification dans le nombre de publications entraînera la modification de la propriété `$ post_count

Voici le code pertinent de la classe WP_Query

if ( ! $q['suppress_filters'] ) {
    /**
     * Filter the array of retrieved posts after they've been fetched and
     * internally processed.
     *
     * @since 1.5.0
     *
     * @param array    $posts The array of retrieved posts.
     * @param WP_Query &$this The WP_Query instance (passed by reference).
     */
    $this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) );
}
// Ensure that any posts added/modified via one of the filters above are
// of the type WP_Post and are filtered.
if ( $this->posts ) {
    $this->post_count = count( $this->posts );
    $this->posts = array_map( 'get_post', $this->posts );
    if ( $q['cache_results'] )
        update_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']);
    $this->post = reset( $this->posts );
} else {
    $this->post_count = 0;
    $this->posts = array();
}

Si vous souhaitez ajouter une publication dans le tableau des publications renvoyées, vous devez le faire.

add_filter( 'the_posts', function ( $posts, \WP_Query $q )
{
    if ( !$q->is_main_query ) // Only target the main query, return if not. Add any additional conditions
        return $posts;

    $post_to_add = [
        // Valid post properties
    ]; 

    $post_to_add = array_map( 'get_post', $post_to_add );

    // Add some checks to make sure our $post_to_inject is a valid.

    // Add $post_to_add in front of $posts array
    $posts = array_merge( $post_to_add, $posts );

    // If you need to replace $posts with your object
    //$posts = [$post_to_add];

    return $posts;
}, 10, 2 );

$post est défini à partir de la première publication du tableau $posts, il est donc inutile de manipuler cela.

Comme pour $found_posts, vous pouvez utiliser le filtre found_posts pour ajuster le nombre de publications trouvées.

add_filter( 'found_posts', function ( $found_posts, \WP_Query $q )
{
        if ( !$q->is_main_query ) // Only target the main query, return if not. Add any additional conditions
            return $found_posts;

    $found_posts = 1; // Taken info from your question

    return $found_posts;
}):    

Comme je l'ai dit, je ne suis pas particulièrement sûr de ce que vous devez faire, mais j'espère avoir touché le point que vous êtes après

1
Pieter Goosen