Комбинация shortcod-а со вставкой текста и динамического файла

Пытаюсь создать комбинацию как написано в вопросе выше.

function shortcode_ingred ( $atts ) {
  ob_start();
  $atts = shortcode_atts(array (
    'how-much' => '',
    'type' => '',
    'name' => '',
  ), $atts );
 $template1 = get_template_part( "shortcodes/value-type/{$atts['type']}" );
$template2 = get_template_part( "shortcodes/ingredient-name/{$atts['name']}" );
  $out = '
    <div>
        <how-much>
            '.$atts['how-much'].'
        </how-much>
        <type>
            '. $template1 .'
        </type>
        <span>-</span>
        <name>
            '.$template2.'
        </name>
    </div>
    ';
    
  
   return $out;
    return ob_get_clean();
}
add_shortcode( 'ingredient', 'shortcode_ingred' );

На примере должен писаться шорткод:

[ingredient how-much="450" type="gramm" name="sugar"]

На выходе на английском:

<div>
    <how-much>450</how-much>
    <type>gramm</type>
    <span>-</span>
    <name>sugar</name>
</div>

Динамическая подгрузка в зависимости от атрибута нужна т.к. в файлах предусмотрены переводы на разные языки.

По моему коду выше выходит что-то типа: пример вывода shortcod-a

Может быть связано с функцией ob_start() и ob_get_clean. Их надо только к подгрузке файлам применять, и не применить к статическому атрибуту how-much (наверное). Пробовал по разному крутить вертеть и все никак. Я не очень дружу с php, поэтому прошу помощи.


Ответы (1 шт):

Автор решения: KAGG Design

Функция get_template_part() возвращает false или null и выводит часть шаблона на экран. Её надо обрачивать в вызовы буферных функций.

/**
 * Ingredient shortcode.
 *
 * @param array $atts Attributes.
 *
 * @return false|string
 */
function shortcode_ingred( $atts ) {
    $atts = shortcode_atts(
        [
            'how-much' => '',
            'type'     => '',
            'name'     => '',
        ],
        $atts
    );

    ob_start();
    get_template_part( "shortcodes/value-type/{$atts['type']}" );
    $template1 = ob_get_clean();

    ob_start();
    get_template_part( "shortcodes/ingredient-name/{$atts['name']}" );
    $template2 = ob_get_clean();

    $out = '
    <div>
        <how-much>
            ' . $atts['how-much'] . '
        </how-much>
        <type>
            ' . $template1 . '
        </type>
        <span>-</span>
        <name>
            ' . $template2 . '
        </name>
    </div>
    ';


    return $out;
}

add_shortcode( 'ingredient', 'shortcode_ingred' );
→ Ссылка