En fait, chaque publication de type publication personnalisée ne contient qu'une table comportant plusieurs lignes différentes. Chaque ligne est importante, nous voulons donc les compter par une fonction et je pense que c'est possible en comptant les balises <tr>
. Je veux afficher le nombre de lignes dans single.php
et même l'afficher dans archive.php
en tant qu'élément pour chaque publication par une fonction de la boucle.
Pourriez vous m'aider s'il vous plait?
Sur la base de ce que vous avez mentionné dans les commentaires, j'ai jeté la réponse originale.
Si ce que vous voulez faire, c'est compter les lignes d'une table contenue dans le contenu de l'article, alors tout ce que vous faites est de compter les balises <tr>
pour obtenir les lignes (en supposant que toutes les balises <tr>
doivent être comptées). Toutes les autres balises HTML peuvent être ignorées.
Pour ce faire, j'accroche à template_redirect
- l'action est assez tardive pour que l'objet $post
soit disponible, mais suffisamment tôt pour vous permettre d'afficher le résultat quelque part dans votre message/votre page.
Le comptage peut être effectué avec substr_count()
qui vous donne le nombre d’occurrences d’une chaîne. Compter les balises <tr>
vous donne alors le nombre de lignes. (Remarque: comptez les balises à l'aide de la chaîne "" si elles contiennent des attributs.) Le contenu de la publication est disponible en $post->post-content
.
Ceci est placé dans une variable globale qui est sélectionnée dans la display_table_row_count()
personnalisée que vous pouvez utiliser pour afficher votre résultat.
add_action( 'template_redirect', 'my_post_table_row_count' );
function my_post_table_row_count() {
global $post, $table_rows_total;
if ( is_single() && is_object( $post ) ) {
// Count "<tr" instead of "<tr>" in case there are attributes
$table_rows_total = substr_count( $post->post_content, '<tr' );
} else {
$table_rows_total = false;
}
}
function display_table_row_count() {
global $table_rows_total;
return ( $table_rows_total ) ? $table_rows_total : '0';
}
Ensuite, partout où vous avez besoin du résultat, vous pouvez utiliser les éléments suivants:
<?php echo display_table_row_count(); ?>
Mise à jour pour répondre aux questions dans les commentaires
Pour refléter les exigences supplémentaires mentionnées dans les commentaires, voici une édition du code permettant de:
Pour # 3, puisque ceci serait également appelé sur les archives, il est nécessaire de se débarrasser de la vérification is_single (). Sinon, il ne serait disponible que sur single.php. Si cela n'est pas nécessaire et que cela sera utilisé sur les archives, alors la fonction utilitaire n'a pas besoin d'être connectée à template_redirect
- ni à aucun autre hook. Il devrait être libre d'être appelé n'importe où.
S'il est libre d'appeler n'importe où, gardez à l'esprit que l'objet $post
sera le type $post
traité. Donc, s'il s'agit d'une boucle d'archivage, votre appel de fonction devra être dans le contexte de la boucle. Si elle est appelée en dehors de la boucle, elle renverra uniquement le $post
sur lequel elle est activée (exemple: avant la boucle, elle renverrait uniquement le premier message de la boucle).
Pour # 2, il y a une limitation à ce que j'ai fourni ici. Cela ne fait que rechercher le nombre d'occurrences de la chaîne demandée. Cela fonctionne en supposant que toute ligne avec la chaîne demandée ne possède qu'une seule occurrence de cette chaîne dans la ligne, ce qui donne un nombre de lignes contenant la chaîne. Si cette chaîne apparaît plusieurs fois dans une même ligne, elle ne renverra pas de résultat précis.
SI il y a des situations où cela se produit (chaîne plus d'une fois dans la ligne), la façon de la gérer doit être différente (et donc plus complexe) car vous auriez (probablement) besoin d'obtenir un tableau des lignes, parcourez ce tableau et comptez chaque ligne contenant une occurrence quelconque de la chaîne demandée. Cela pourrait être fait, mais pas avec les informations fournies. J'ai donc limité cela à la situation la plus probable d'une seule occurrence de la chaîne dans chaque ligne.
Tout ce dont vous avez besoin est cet utilitaire:
function my_row_count( $search_for = false ) {
// Get the $post object
global $post;
// If no "search_for" param, return the row count.
if ( ! $search_for ) {
return substr_count( $post->post_content, '<tr' );
}
// Get count for requested string
$requested = substr_count( $post->post_content, $search_for );
return ( $requested > 0 ) ? $requested : 0;
}
Pour afficher le nombre total de lignes:
<?php echo my_row_count(); ?>
Pour afficher le nombre d'une chaîne demandée (c'est-à-dire # 123):
<?php echo my_row_count( '#123' ); ?>
Rappelez-vous que si elle est utilisée sur une page qui n'est pas une publication unique, la fonction doit être utilisée dans la boucle.