I wanted to elaborate on the answers with examples for those who need help.
How to count shortcodes in a post
Possible reasons you are here:
- Multiple instanced of same shortcodes with unique id
- You need the same shortcode outputting unique class each call
- Set a variable counter to count shortcode usage
- How to count how many times you have used a shortcode on the current page
- Set a unique incrementing number for each shortcode
- set a random number for data attribute shortcode
Use a static variable to count each shortcode call
https://www.php.net/manual/en/language.variables.scope.php#language.variables.scope.static
With a static variable with int value static $count = 1;
called we can increment the value on each call of the shortcode with $count++;
. I use this for adding custom ids to the output html of a SwiperJS slideshow shortcode that pulls in custom post type featured images I reuse on the same page. SwiperJS requires each element to have a unique class. With this new unique ID, the javascript can initialize each as unique objects or for use in styling purposes.
Example 1 PHP
add_shortcode('count_example', 'count_example_shortcode');
function count_example_shortcode( $atts = [], $content = null) {
// Options
ob_start();
/**
* Static variable
*/
static $count = 1; // if your prefer to start with zero change to 0
$atts = shortcode_atts(
[
// Shortcode Attribute defaults
'count' => 'true',
],
$atts
);
// You can check if shortcode attribute is set
if ($atts['count'] == true) {
echo '<div id="example-'.$count.'">html stuff</div>';
// or check the string value of attribute
} elseif ($atts['count'] == "true") {
echo '<div id="example-'.$count.'">html stuff</div>';
// Use this below if no attributes are set
else {
echo '<div id="example">html stuff</div>';
}
/**
* Increment int variable $count for each shortcode call
*/
$count++;
return ob_get_clean();
}
Example 1 Shortcodes
[count_example count="foo"]
[count_example count="true"]
[count_example]
Example 1 Output
<div id="example-1">html stuff</div>
<div id="example-2">html stuff</div>
<div id="example">html stuff</div>
Multilayered Example
Need a counter, and a need unique ID, class or data attribute consider using uniqueid()
or random_int()
.
add_shortcode('count_example', 'count_example_shortcode');
function count_example_shortcode( $atts = [], $content = null) {
// Options
ob_start();
/**
* Static Variable Counter, UniqueID, or Random_int
*/
$count = 1;
$prefix = 'example-';
$uniqueID = $uniqid = uniqid($prefix); // https://www.php.net/manual/en/function.uniqid
$random_integer = random_int(100, 999); // https://www.php.net/manual/en/function.random-int.php
// Attributes not used in this example, kept in example for complete structure
$atts = shortcode_atts(
[
'count' => 'true',
],
$atts
);
echo '<div class="exammple-'.$count.'" id="'.$uniqueID.'" data-id="'.$random_integer.'">html stuff</div>';
return ob_get_clean();
}
Example 2 Shortcodes
[count_example]
[count_example]
Example 2 Output
<div class="example-1" id="example-4b3403665fea6" data-id="735">html stuff</div>
<div class="example-2" id="example-4fe424wg4w33f" data-id="924">html stuff</div>