Есть ли способ передать данные между вложенными шорткодами WordPress в плагине? - PullRequest
1 голос
/ 23 мая 2019

Я знаю, что есть способ сделать это, однако мне трудно понять это. Вот моя проблема.

У меня есть шорткод, который запускает функцию, которая приносит в магазин инвентарь. Я форматирую данные, которые возвращаются с HTML. Мой плагин делает это уже используя следующий шорткод ['inventory']

То, что я хотел бы сделать, находится в той же функции, если это возможно, я хотел бы создать еще несколько коротких кодов, таких как [product_id]

И, надеюсь, из той же функции поместите текущие записи product_id в значение этого шорткода, пока я перебираю записи.

А также использовать некоторые элементы темы WordPress в сочетании с шорткодом.

Допустим, шорткод инвентаря возвращает следующее

<div>
    <h1>Product ID {$product_id}</h1>
    <p>Price $price</p>
</div>

и циклически просматривает каждый продукт, так что если будет 4 продукта, он выведет вышеуказанный HTML 4 раза.

Используемая мной тема позволяет мне создавать кнопки, специфичные для моей темы, я не хочу жестко кодировать эти кнопки в своем коде.

Я хочу сделать следующее:

[inventory]
    ['record']
        //Insert theme buttons using themes builder
        <button value=['product_id']>Get more info</button>
    ['/record]
[/inventory]

Итак, я хотел бы иметь инвентарь, сгенерировать данные для вывода, но вместо циклического прохождения и вывода идентификатора, например, циклически проходить и передавать данные в шорткод ['record'], а затем иметь это тег отображает вывод кнопками под каждой записью. И присвойте значению кнопки шорткод product_id, который будет содержать текущий идентификатор продукта записи.

Я хочу сказать, что задействован do_shortcode, но я не совсем уверен, как этого добиться.

Любая помощь приветствуется

Я попытался прочитать документацию.

function inventory($atts, $content = null){
    extract(shortcode_atts(array(
        'storeid' => 'default',
    ), $atts));
//query that returns the store inventory
$query;

//Output formatted results FYI there is a whole function that but it pretty much just loops through the $query results.
    foreach($query as $queryResult){
        echo $queryResult;
    }
}
add_shortcode('inventory', 'inventory');


<div>
    <h1>Product ID {$product_id}</h1>
    <p>Price $price</p>
</div>
<button value="apple">Get More Info</button>

Подробнее

Итак, у меня есть проект, над которым я работаю, но мне трудно сосредоточиться на том, как работать с вложенными шорткодами.

Вот что у меня есть

[inventory store=some_store_id category=fruit]

Этот шорткод в настоящее время возвращает из базы данных следующее [[0]="product_id"=>['name'=>'apple', 'price'=>'2.00'],[1]="another_product_id"=>['name'=>'apple', 'price'=>'2.00']]

Мне бы хотелось что-то подобное

<div>
[inventory store=some_store_id category=fruit]
[individual_product]
<div>
<h1>[product_id]</h1>
</div>
<div><h2>[name]</h2></div>
<div><p>[price]</p></div>
[/individual_product]
[/inventory]
</div>

1 Ответ

0 голосов
/ 23 мая 2019

$content вашей функции инвентаря содержит все между тегами [инвентаря] шорткода. Вы можете найти и заменить код, чтобы поместить идентификатор продукта в качестве атрибута, а затем вызвать do_shortcode для измененной строки, чтобы обработать любые шорткоды, добавленные создателем тем. Я обнаружил, что скобки вокруг product_id проблематичны, если вы не вызываете другой шорткод там ...

function inventory_shortcode_function( $atts, $content = null ){

  // do inventory query here
  $inventory = [1,2,3];

  $output = '<p>There are ' . count( $inventory ) . ' items.</p>';

  foreach( $inventory as $item ) {
    $loop_content = str_replace( '[record]', '[record product_id="' . $item . '"]', $content );
    $output .= '<div>' . do_shortcode( $loop_content ) . '</div>';
  }

  return $output;
}
add_shortcode('inventory', 'inventory_shortcode_function' );


function record_shortcode_function( $atts, $content = null ){
  extract( shortcode_atts([ 'product_id' => -1], $atts ) );

  return do_shortcode( str_replace( 'product_id', $product_id, $content ) );
}
add_shortcode('record', 'record_shortcode_function' );

Это контент, который я поместил в редакторе контента:

[inventory]
  [record]
  //Insert theme buttons using themes builder
  <button value="product_id">Get more info</button>
  [/record]
[/inventory]

И это сгенерированный HTML:

<p>There are 3 items.</p>
<div>
  //Insert theme buttons using themes builder
  <button value="1">Get more info</button></div>
<div>
  //Insert theme buttons using themes builder
  <button value="2">Get more info</button>
</div>
<div>
  //Insert theme buttons using themes builder
  <button value="3">Get more info</button>
</div>
...