Комбинация 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>
Динамическая подгрузка в зависимости от атрибута нужна т.к. в файлах предусмотрены переводы на разные языки.
По моему коду выше выходит что-то типа:
Может быть связано с функцией ob_start() и ob_get_clean. Их надо только к подгрузке файлам применять, и не применить к статическому атрибуту how-much (наверное). Пробовал по разному крутить вертеть и все никак. Я не очень дружу с php, поэтому прошу помощи.
Ответы (1 шт):
Функция 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' );