Несколько параметров для шорткода
Я работаю над созданием шорткодов для своего блога. Я могу установить один параметр для шорткода, но не уверен, как установить разные параметры.
Например, я могу использовать [myshortcode myvalue]
для вывода html блока внутри контента записи.
Вот что я сейчас использую:
function test_shortcodes( $atts ) {
extract( shortcode_atts( array(
'myvalue' => '<div class="shortcodecontent"></div>'
), $atts ) );
return $myvalue;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );
Теперь, как я могу использовать [myshortcode myothervalue]
для вывода другого html блока?
Обратите внимание, что шорткод тот же самый, изменяется только параметр.

Давайте рассмотрим шорткод:
[SH_TEST var1="somevalue" var2="someothervalue"]THE SHORTCODE CONTENT[/SH_TEST]
Функция-обработчик шорткода принимает 3 параметра:
$atts
- массив атрибутов, переданных в шорткоде. В нашем случае:$atts['var1']
содержит значение'somevalue'
$atts['var2']
содержит значение'someothervalue'
$content
- строка с содержимым между открывающим и закрывающим тегами шорткода. В нашем случае: -$content
содержитTHE SHORTCODE CONTENT
$tag
- строка с именем тега шорткода. В нашем случае: -$tag
содержитSH_TEST
При создании шорткода я обычно определяю значения по умолчанию и объединяю их с переданными значениями, например:
add_shortcode('SH_TEST','SH_TEST_handler');
function SH_TEST_handler($atts = array(), $content = null, $tag){
shortcode_atts(array(
'var1' => 'default var1',
'var2' => false
), $atts);
if ($atts['var2'])
return 'myothervalue';
else
return 'myvalue';
}

Если вы используете шорткод таким образом, atts[0]
будет содержать значение:
add_shortcode( 'test', 'test_callback' );
function test_callback( $atts )
{
return $atts[0];
}
Другой способ — вызвать значение по имени:
[myshortcode val="myvalue"]
function test_callback( $atts )
{
return $atts["val"];
}

Лучше сделать это следующим образом:
function test_shortcodes( $atts ) {
extract( shortcode_atts( array(
'type' => 'myvalue' // значение по умолчанию
), $atts ) );
switch( $type ){
case 'myvalue':
$output = '<div class="shortcodecontent"></div>';
break;
case 'myothervalue':
$output = '<div class="othershortcodecontent"></div>';
break;
default:
$output = '<div class="defaultshortcodecontent"></div>';
break;
}
return $output;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );
Используйте это так:
[myshortcode type="myvalue"]
для вывода <div class="shortcodecontent"></div>
или
[myshortcode type="myothervalue"]
для вывода <div class="othershortcodecontent"></div>

Этот способ работает для меня во всех случаях с использованием [myshortcode type="myvalue"]
function test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
'type' => 'myvalue'
), $atts ) );
switch( $atts['type] ){
case 'myvalue':
$output = '<div class="shortcodecontent"></div>';
break;
case 'myothervalue':
$output = '<div class="othershortcodecontent"></div>';
break;
default:
$output = '<div class="defaultshortcodecontent"></div>';
break;
}
return $output;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );
Если вы хотите добавить ещё один параметр, всё что нужно сделать - это [myshortcode type="myvalue" other="somevalue"]
test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
'type' => 'myvalue', //Может быть значением по умолчанию
'other' => 'somevalue' //Может быть значением по умолчанию
), $atts ) );
switch( $atts['other'] ){
case 'somevalue':
$output = '<div class="shortcodecontent">somevalue</div>';
break;
case 'myothervalue':
$output = '<div class="othershortcodecontent"></div>';
break;
default:
$output = '<div class="defaultshortcodecontent"></div>';
break;
}
return $output;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );
Надеюсь, это поможет

Сначала вам нужно определить элемент $atts в вашей функции, так как $atts является массивом.
Вот полный код для передачи переменной в шорткод:
Предположим, вам нужно отобразить все товары категории через шорткод. Вам нужно добавить следующий код в ваш файл функций:
function creative_writing_func($atts) {
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'product_cat' => $atts['categoryname']
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product;
echo '<br /><a href="'.get_permalink().'">' .
woocommerce_get_product_thumbnail().' '.get_the_title().'</a>';
endwhile;
wp_reset_query();
}
add_shortcode('creative_writing_func_short', 'creative_writing_func');
Теперь вы можете просто вставить шорткод в файл шаблона или стандартный редактор WordPress:
[creative_writing_func_short categoryname="creative-writing-english-literature"]
Где мы передаем имя категории (creative-writing-english-literature) в шорткод.
Код протестирован и работает.

Нельзя использовать echo
в шорткоде, функция обратного вызова должна возвращать строку.

Пожалуйста, не публикуйте непроверенный код. Особенно если утверждаете, что он протестирован и работает!

@fuxia Вы можете использовать как echo, так и HTML-теги, это зависит от ваших требований. Я использовал этот шорткод в визуальном компоновщике, чтобы отображать название продукта с миниатюрой и ссылкой. И он работает идеально.

@AndyMacaulay-Brook В настоящее время я использую этот код в своем электронном магазине на Wordpress. Как я уже говорил, он протестирован.

См. https://wordpress.stackexchange.com/a/73083/73 для объяснения. Если вы используете echo
, содержимое может выводиться там, где вы этого не ожидаете.

@fuxia Контент будет выводиться там, где вы добавляете свой шорткод. Как я уже объяснил - я использую тот же шорткод (с некоторыми обновленными HTML-тегами) в визуальном компоновщике, и он работает корректно. Спасибо за ваши предложения.
