web-dev-qa-db-fra.com

Comment obtenir le nombre de pages dans un seul post pagination?

Existe-t-il un moyen d'interroger le nombre de pages/la dernière page d'une publication unique paginée par <!--nextpage--> sur wordpress?

function count_post_pages($post_id) {
    $the_post = get_post($post_id);
    return count(explode('<!--nextpage-->', $the_post->post_content));
}

Je ne suis pas sûr que ce soit la bonne façon de le faire, mais quelqu'un peut-il aider ...

6
Edogawa Kudo

Dans la boucle, comme michael _ { souligné , vous pouvez simplement vous référer à la variable globale $numpages.

En dehors de la boucle, votre code est presque correct.

Étant le nombre de pages le nombre de <!--nextpage--> + 1, vous pouvez enregistrer un appel de fonction en faisant:

$numOfPages = 1 + substr_count($the_post->post_content, '<!--nextpage-->');

En tant que solution rapide et non perverse, cela convient parfaitement.

Toutefois, ce code ne prendrait pas en compte les filtres et autres éléments mineurs (par exemple, <!--nextpage--> au tout début du contenu de la publication est ignoré).

Donc, pour être 100% compatible avec le code du noyau, votre fonction devrait être quelque chose comme:

function count_post_pages($post_id) {
    $post = get_post($post_id);
    if (!$post) {
       return -1;
    }

    global $numpages;
    $q = new WP_Query();
    $q->setup_postdata($post);

    $count = $numpages;

    $q->reset_postdata();

    return $count;
}

Ceci est 100% compatible avec le code principal, mais est également plus "coûteux" et déclenche plus de hooks que nécessaire (avec des effets secondaires éventuellement inattendus).

La troisième solution serait:

function count_post_pages($post_id) {
    $post = get_post($post_id);
    if (!$post) {
       return -1;
    }

    $content = ltrim($post->post_content);
    // Ignore nextpage at the beginning of the content
    if (strpos($content, '<!--nextpage-->') === 0) {
         $content = substr($content, 15);
    }

    $pages = explode('<!--nextpage-->', $content);
    $pages = apply_filters('content_pagination', $pages, $post);

    return count($pages);
}

Cette solution est relativement "bon marché" et conforme à 100% au noyau ... pour le moment , en fait, le problème avec ce code est qu'il duplique du code qui pourrait changer dans les versions futures (par exemple, " "content_pagination" a été ajouté dans la version 4.4, donc tout récemment).

2
gmazzap

jetez un oeil à https://codex.wordpress.org/Global_Variables#Inside_the_Loop_variables

dans la boucle, les variables globales liées à la balise <!--nextpage--> sont les suivantes:

$page - la sous-page réelle,

$multipage - (boolean) = 1 si la page suivante a été utilisée

$numpages - nombre total de sous-pages

4
Michael

Lorsque WordPress utilise une telle pagination, il existe une variable de requête $paged sur laquelle elle est activée. Donc, la page 1 est $paged=1 et la page 15 est $paged=15.

Vous pouvez obtenir la valeur de cette variable avec le code suivant:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; Obtenir le nombre total de pages est un peu plus compliqué. Vous devez d’abord compter tous les articles de la base de données. Puis filtrez par quels messages sont publiés (par rapport aux brouillons, planifiés, corbeille, etc.). Ensuite, vous devez diviser ce nombre par le nombre de messages que vous souhaitez voir apparaître sur chaque page:

$total_post_count = wp_count_posts(); $published_post_count = $total_post_count->publish; $total_pages = ceil( $published_post_count / $posts_per_page ); Je n'ai pas encore testé cela, mais vous devrez peut-être extraire $posts_per_page de la même manière que vous avez récupéré $paged (à l'aide de get_query_var()).

1
huykon225