我正在尝试计算 WordPress 安装上给定帖子的字数。
当我瞄准内容时
$word_counter = str_word_count(the_content());
它可以工作,但这只是一小部分,其余的由各种 ACF 布局块组成,它们都由
get_template_part
收集并需要放入 single.php
文件中。
有没有办法可以从
single.php
页面计算所有这些块生成的单词数量?
我的问题是我一直在进入每个布局模板,并通过每个字段来计算单词数:
应用程序/builder.php
if (get_field('layouts_templates', 'option')):
$word_counter_main = 0;
while (have_rows('layouts')) : the_row();
$word_counter_main = $word_counter_main + str_word_count(get_sub_field('content'));
if (get_row_layout() == 'template') {
$template_builders[get_sub_field('layouts_template')] = null;
}
endwhile;
endif;
但我不知道如何将其传递回
single.php
以将所有单词计数器添加到总数中。
single.php
...
// layouts
get_template_part('app/builder');
更新
布局中还有一些模板,这是结构
array(9) {
["layouts"] =>
array(3) {
array(12) {
["acf_fc_layout"]=> "main-content"
["acfe_flexible_toggle"]=> ""
["acfe_flexible_layout_title"]=> ""
["content"]=> "Need to collect the content here"
}
array(2) {
["acf_fc_layout"]=> "car_details"
["cars"]=>
array(3) {
[0]=>
array(2) {
["name"]=>
string(23) "Audi"
["content"]=> "Need to collect the content here"
}
[1]=>
array(2) {
["name"]=>
string(23) "Seat"
["content"]=> "Need to collect the content here"
}
[2]=>
array(2) {
["name"]=>
string(23) "Opel"
["content"]=> "Need to collect the content here"
}
}
}
}
}
我不知道如何将所有内容放入一个变量中
如果您想使用当前的逻辑,您可以在functions.php中创建一个辅助函数,该函数返回每个帖子的$word_counter_main。
函数.php
function get_current_post_word_count($post_id) {
$word_counter_main = 0;
$word_counter_main += str_word_count(get_the_content($post_id));
if (get_field('layouts_templates', 'option')):
$word_counter_main = 0;
while (have_rows('layouts', $post_id)) : the_row();
$word_counter_main += str_word_count(get_sub_field('content'));
if (get_row_layout() == 'template') {
$template_builders[get_sub_field('layouts_template')] = null;
}
endwhile;
endif;
return $word_counter_main;
}
single.php
$post_word_count = NAMESPACE\get_current_post_word_count(get_the_ID());
另一种方法是为每个帖子创建一个元字段,每当您更新帖子时该字段都会更新,然后您只需加载元字段值即可。这样您就不必在每次加载帖子时循环浏览所有内容。
更新:
这是一种使用 PHP 从多维数组中通过键获取所有值的巧妙方法。这也适用于您的情况。
函数.php
$example_array = array(
'layouts' => array(
array(
'acf_fc_layout' => 'main-content',
'acfe_flexible_toggle' => '',
'acfe_flexible_layout_title' => '',
'content' => 'This is main content',
),
array(
'acf_fc_layout' => 'car_details',
'cars' => array(
array(
'name' => 'Audi',
'content' => 'This is content from audi',
),
array(
'name' => 'Seat',
'content' => 'This is content from seat',
),
array(
'name' => 'Opel',
'content' => 'This is content from opel',
),
),
),
),
);
function array_value_recursive($key, array $arr)
{
$val = array();
array_walk_recursive($arr, function ($v, $k) use ($key, &$val) {
if ($k == $key) array_push($val, $v);
});
return count($val) > 1 ? $val : array_pop($val);
}
$only_content_fields = array_value_recursive('content', $example_array);
控制台输出
Array
(
[0] => This is main content
[1] => This is content from audi
[2] => This is content from seat
[3] => This is content from opel
)
现在您可以循环这个新创建的数组并使用 str_word_count 函数计算单词数。希望这有帮助:)