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 ...
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).
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
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()
).