web-dev-qa-db-fra.com

Défilement Jetpack Infinite en conflit avec les posts personnalisés du thème pré_get_posts du thème

J'ai la fonction actuelle sur mon thème en utilisant pre_get_posts, actuellement tout en bas du fichier functions.php de mon thème:

function mytheme_portfolio_archive_pages( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_post_type_archive( 'mytheme_portfolio' ) ) {
        // Display 20 posts for a custom post type called 'mytheme_portfolio'
        $query->set( 'posts_per_page', 20 );
        return;
    }
}
add_action( 'pre_get_posts', 'mytheme_portfolio_archive_pages', 1 );

Cela signifie que j'ai 20 articles par page si l'archive actuelle est du type d'article mytheme_portfolio, au lieu de la valeur par défaut 5 pour les pages de blog (le nombre 5 est défini dans "Les pages de blog affichent au plus __ articles" dans Paramètres → Lecture). .

La fonction ci-dessus fonctionne correctement lorsque Jetpack Infinite Scroll est désactivé.

Le problème est que je veux utiliser Jetpack Infinite Scroll avec l'archive 'mytheme_portfolio'. Et lorsque cette fonction est activée, la fonction ci-dessus cesse de fonctionner et l'Infinite Scroll utilise le numéro "Blogs contenant au plus 5 messages" de Paramètres → Lecture lors du chargement de nouveaux messages. Sinon, Infinite Scroll fonctionne bien, mais je dois afficher 20 articles par page, et non 5, si je suis sur une page d'archive mytheme_portfolio!

Le code d'installation de mon Jetpack est comme suit, juste pour référence:

    function mytheme_render_infinite_scroll() {
        while ( have_posts() ) : the_post();
                if ('mytheme_portfolio' == get_post_type() && !is_search()) :
                    get_template_part( 'content', 'archive-portfolio' );
                elseif ( is_search() ) :
                    get_template_part('content','search');
                else :
                    get_template_part( 'content', get_post_format() );
                endif;
        endwhile;
    }

    function mytheme_jetpack_setup() {
        add_theme_support( 'infinite-scroll', array(
            'container'      => 'content',
            'footer_widgets' => 'footer-widgets',
            'type'           => 'click',
            'render'         => 'mytheme_render_infinite_scroll',
            'wrapper'        => true,
            'posts_per_page' => false
        ) );
    }
    add_action( 'after_setup_theme', 'mytheme_jetpack_setup' );

Merci beaucoup pour toute aide que n'importe qui peut donner!

EDIT: J'ai trouvé la ligne en conflit dans le code du plug-in Jetpack, dans jetpack/modules/infinite-scroll/infinity.php, ligne 26 ...

function __construct() {
    add_action( 'pre_get_posts',                  array( $this, 'posts_per_page_query' ) );
    ...

ce qui correspond aux lignes 449 - 452 du même fichier:

function posts_per_page_query( $query ) {
    if ( ! is_admin() && self::archive_supports_infinity() && $query->is_main_query() )
        $query->set( 'posts_per_page', self::get_settings()->posts_per_page );
}

Si je commente la ligne 26, ma fonction fonctionne. Évidemment, je ne veux pas modifier les fichiers du plugin. Y a-t-il moyen de m'assurer que l'argument posts_per_page de mon thème (bloc de code initial ci-dessus) est celui qui est utilisé, et non celui de Jetpack?

1
Sarah

Vous avez spécifié une priorité de 1 pour votre fonction pre_get_posts ici:

add_action( 'pre_get_posts', 'mytheme_portfolio_archive_pages', 1 );

Jetpack ne spécifie pas de priorité:

add_action( 'pre_get_posts', array( $this, 'posts_per_page_query' ) );

Donc, cela est ajouté avec la priorité par défaut pour add_action , qui est 10:

$ priority (int) (optionnel) Utilisé pour spécifier l'ordre dans lequel les fonctions associées à une action particulière sont exécutées. Les nombres inférieurs correspondent aux exécutions antérieures et les fonctions ayant la même priorité sont exécutées dans l'ordre dans lequel elles ont été ajoutées à l'action. Défaut: 10

Ainsi, pour chacune de ces demandes, votre code est exécuté et définit le nombre de publications par page sur 20, puis le code de Jetpack est exécuté et remplace votre valeur par la sienne.

Pour résoudre ce problème, spécifiez une priorité plus basse afin que la vôtre s'exécute plus tard et écrase les données de Jetpack:

add_action( 'pre_get_posts', 'mytheme_portfolio_archive_pages', 20 );
3
Milo