web-dev-qa-db-fra.com

Comment activer/désactiver la pagination dans les résultats de recherche et les listes de catégories via un lien?

Sur ce site Web, l'utilisateur veut pouvoir désactiver la pagination, de manière à pouvoir envoyer l'intégralité des résultats d'une recherche ou d'une requête de catégorie à imprimer sous la forme d'un gros document. Cela semble évident, alors j'ai été surpris de ne trouver aucun plugin ... maintenant je sais peut-être pourquoi.

Cela fait un moment que je me bats avec cela, et je crains que ma compréhension de WordPress ne soit tout simplement pas à la hauteur ... ce que j'ai essayé, c'est:

  1. ajout d'une chaîne de requête à l'URL:? onepageprint = 1 (fonctionne)
  2. enregistrer une fonction 'désactiver la pagination' (fonctionne)
  3. tester la chaîne de requête et appeler de manière conditionnelle la fonction (ne fonctionne pas).

Le problème que j'ai pense que j’ai, c’est que la pagination est configurée trop tôt dans le processus WordPress, avant qu’elle arrive à un endroit où je peux extraire la chaîne de requête de l’URL et la tester (sans pirater le cœur!). )

Donc, deux questions et une pensée:

  1. est-ce que j'y vais de la bonne façon?
  2. mon sens du problème est-il correct et, dans l'affirmative, existe-t-il une solution de contournement? et si cela ne fonctionne vraiment pas (dernière tentative ci-dessous) ...
  3. est-il possible de faire cela avec redirect_canonical (que je reconnais ne pas comprendre du tout!)

J'ai gâché avec d'innombrables variations - voici la dernière tentative (bien qu'il puisse y avoir des doublons). Définir la chaîne de requête et la sortir de l'URL semble bien fonctionner, et la fonction de désactivation de la pagination fonctionne également ... mais quand elle est en place, il toujours fonctionne (ou ne fonctionne jamais), et je ne peux pas trouver un moyen quelconque de l'activer et de l'éteindre conditionnellement:

Dans functions.php:

/* register custom query var (from URL) to toggle pagination */
function jr_add_query_vars_filter( $displayvars ){
    $displayvars[] = "onepageprint";
    return $displayvars;
}
add_filter( 'query_vars', 'jr_add_query_vars_filter' );
get_query_var( 'onepageprint', 0 );

/* disable pagination conditionally on custom query var setting (from URL query string) 
 * NOT WORKING YET */
add_Action('init', 'remove_pagination');

function remove_pagination() {
if ( ! $onepageprint == 1 )
    return; // stop here.
    /* Disable content pagination, based on
     * https://wp-types.com/forums/topic/remove-pagination-from-archive-view/ */
    add_action('parse_query', 'no_nopaging');
    function no_nopaging($query) {
    $query->set('nopaging', 1);
    }
}

Dans les modèles de page (une des nombreuses tentatives) - je suppose que ceci, ou quelque chose du genre, doit aller à la fois dans search.php et archive.php:

// call no-pagination function - DIDN'T WORK
if ( $onepageprint == 1 ) {
no_nopaging($query);
}

J'espère que cela a du sens, et faites-moi savoir s'il vous en faut plus dans ma configuration pour y répondre. Malheureusement, je ne peux pas poster de liens vers le site actuel car il s'agit d'un site de recherche privé et tout ce qu'il contient est confidentiel!

Même quelques indications sur une meilleure façon de le faire seraient formidables. Merci beaucoup.

[Edit: titre amélioré juste après la publication!]

1
wwwolf

Je pense que cela devrait fonctionner en se connectant à pre_get_posts:

function wpse_254661_remove_pagination( $query ) {
    if ( $query->is_main_query() &&  get_query_var( 'onepageprint', 0 ) ) {
        $query->query_vars['nopaging'] = 1;
        $query->query_vars['posts_per_page'] = -1;
    }
}
add_action( 'pre_get_posts', 'wpse_254661_remove_pagination' );

Ainsi, vous pouvez modifier votre requête juste avant qu'elle ne soit récupérée et que l'objet de requête soit transmis par le pointeur directement dans la fonction. Il y a également une vérification pour n'affecter que la requête principale.

0
JHoffmann