Как фильтровать контент, передаваемый в шорткод WordPress

#php #wordpress #shortcode #custom-wordpress-pages #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>
 

Ответ №1:

Существует несколько способов настроить это. Следующий код обернет <div> тег вокруг двух последних <li> тегов, начинающихся после 5-го элемента, точно так, как вы просили в разделе «Предполагаемый вывод» вашего вопроса, НО, пожалуйста, обратите внимание, что вы можете использовать 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>