web-dev-qa-db-fra.com

Injecter des posts (de catégories spécifiques) entre les posts de la boucle

J'aimerais ajouter un article (appartenant à une catégorie spécifique) entre les articles de la boucle WordPress (tels que "Sponsors"). Exemple:

P P P S
P P S P
P S P P

Comment puis-je atteindre cet objectif? Je suis un débutant avec le codage, donc je ne sais pas assez pour modifier une boucle par moi-même. Des Ninjas de Codage en Boucle qui peuvent fournir une solution?

Notez que ci-dessous est ma boucle actuelle. Il est utilisé pour trier les messages par prix ou par ordre aléatoire:

index.php

<?php while (have_posts() ) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<?php  the_excerpt(); the_meta ();
endwhile; 

previous_posts_link();
next_posts_link();
?>

functions.php

function my_custom_query($query){
 if ( $query->is_home() && $query->is_main_query() ) {

  $sort= $_GET['sort'];

  if($sort == "A"){
   $query->set( 'orderby', 'Rand' );
   $query->set( 'posts_per_page', '2' );
  }

  if($sort == "B"){
   $query->set( 'meta_key', 'price' );
   $query->set( 'orderby', 'meta_value_num' );
   $query->set( 'order', 'DESC' );
   $query->set( 'posts_per_page', '2' );
  }
}
}

add_action( 'pre_get_posts', 'my_custom_query' );

Edit: Mise à jour

Le plugin de Birgire fonctionne! Au début, j'avais des problèmes pour que le plugin fonctionne sur mon thème. Le problème était ce morceau de code que j'utilise dans la boucle dans index.php (je l'utilise pour appeler le champ personnalisé à apparaître).

<?php
    global $wp_query;
    $postid = $wp_query->post->ID;
    echo get_post_meta($postid, 'price', true);
    wp_reset_query();
?>
6
leko

Le sponsor automatique envoie l'injecteur:

Voici une idée basée sur ma réponse pour la question: Comment afficher un nombre Y de messages personnalisés après chaque X messages normaux?

J'espère que je l'ai rendu un peu plus utile ici sur Github , mais il pourrait être affiné beaucoup plus (travail futur).

La classe SponsorPostsInjector vous aidera à injecter automatiquement les messages sponsor dans le thème à l’aide des filtres the_post, loop_start et loop_end.

Activez le plug-in et ajoutez l'exemple suivant à votre fichier functions.php pour démarrer les injections:

/**
 * Inject a sponsor post after the first post on the home page,
 * and then again for every third post within the main query.
 */

add_action( 'wp', 'my_sponsor_injections' );

function my_sponsor_injections()
{
    if( ! class_exists( 'SponsorPostsInjector' ) ) return;

    // We want the sponsor posts injections only on the home page:
    if( ! is_home()  ) return;

    // Setup the injection:
    $injector = new SponsorPostsInjector( 
        array(
            'items_before_each_inject' => 3,
            'items_per_inject'         => 1,
            'template_part'            => 'content-sponsor',
        ) 
    );

    // Setup the injection query:
    $injector->query(
        array(
            'post_type'  => 'sponsor',
            'tax_query'  => array( 
                array(
                   'taxonomy' => 'country',
                    'terms'   => 'sweden',    
                    'field'   => 'slug', 
                )
            )
        )
    );

    // Inject:
    $injector->inject();
}

où nous avons créé le fichier modèle content-sponsor.php dans notre répertoire de thèmes actuel, afin de contrôler la mise en page des publications de sponsors injectées.

L'idée est que cela devrait également prendre en charge la pagination.

J'espère que vous pourrez adapter cela à vos besoins.

6
birgire