统计帖子中包含许多 ACF 块的字数

问题描述 投票:0回答:1

我正在尝试计算 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"
        }
      }
    }
  }
}

我不知道如何将所有内容放入一个变量中

php wordpress advanced-custom-fields
1个回答
2
投票

如果您想使用当前的逻辑,您可以在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 函数计算单词数。希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.