如何过滤传递给 WordPress 简码的内容

How to Filter Content passed to a WordPress Shortcode

我正在使用以下自定义 WordPress shortcode 在页面上显示列表,我试图找到第 5 个 LI 元素并在此时注入 DIV。

[expander]
<ul>
    <li>step1</li>
    <li>step 2</li>
    <li>step 3</li>
    <li>step 4</li>
    <li>step 5</li>
    <li>step 6</li>
    <li>step 7</li>
</ul>
[/expander]

简码:

add_shortcode( 'expander', 'my_function' );


function my_function($atts, $content) {

  echo substr_count($content, '<li>'); // 7
  return $content;
}

预期输出:

<ul>
    <li>step1</li>
    <li>step 2</li>
    <li>step 3</li>
    <li>step 4</li>
    <li>step 5</li>

    <div>
      <li>step 6</li>
      <li>step 7</li>
    </div>

</ul>

有多种设置方法。以下代码将在第 5 个元素之后的最后两个 <li> 标签周围包裹一个 <div> 标签,就像您在问题的“预期输出”部分中所请求的那样,但请注意您可以使用shordcode attributes 通过将开始和结束数字作为属性传递来使其动态而不是硬编码。

以下代码是您所要求的硬编码版本!

add_shortcode('expander', 'my_function');


function my_function($atts, $content)
{
  $lists_itmes = substr_count($content, '<li>');
  $list_array = explode('<li>', $content); // This will return an array containing of the values between each <li> tag starting from index 1
  $main_content = "";
  for ($i = 0; $i < $lists_itmes + 1; $i++) {
    switch ($i) {
      case 6:
        $main_content .= "<div><li>" . $list_array[6] . "</li>";
        break;
      case 7:
        $main_content .= "<li>" . $list_array[7] . "</li></div>";
        break;
      default:
        $main_content .= "<li>" . $list_array[$i] . "</li></div>";
        break;
    };
  }
  return $main_content;
}

它会输出:

<ul>
    <li>step 1</li>
    <li>step 2</li>
    <li>step 3</li>
    <li>step 4</li>
    <li>step 5</li>

    <div>
      <li>step 6</li>
      <li>step 7</li>
    </div>

</ul>