Несколько параметров для шорткода

4 февр. 2013 г., 16:22:18
Просмотры: 34.3K
Голосов: 3

Я работаю над созданием шорткодов для своего блога. Я могу установить один параметр для шорткода, но не уверен, как установить разные параметры.

Например, я могу использовать [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 блока?

Обратите внимание, что шорткод тот же самый, изменяется только параметр.

6
Комментарии

Примеры кода вашего шорткода могли бы быть полезными. Хотя бы важные части.

Steve Steve
4 февр. 2013 г. 16:28:41

Вы имеете в виду myvalue="something", верно?

s_ha_dum s_ha_dum
4 февр. 2013 г. 16:35:43

@Stephen Добавил мой фрагмент кода. s_ha_dum нет, я имею в виду не это.

Abhik Abhik
4 февр. 2013 г. 18:22:38

Можете привести пример, как вы пишете шорткод в записи/странице? Код выглядит не совсем логично.

Steve Steve
4 февр. 2013 г. 18:35:51

@Stephen вот пример

Первый абзац записи [myshortcode myvalue]

Второй абзац [myshortcode myothervalue]

Abhik Abhik
4 февр. 2013 г. 18:39:35

Вам нужно изучить кодекс, чтобы понять шорткоды. Ознакомьтесь с документацией: http://codex.wordpress.org/Shortcode_API

Steve Steve
4 февр. 2013 г. 18:42:19
Показать остальные 1 комментариев
Все ответы на вопрос 5
0
10

Давайте рассмотрим шорткод:

[SH_TEST var1="somevalue" var2="someothervalue"]THE SHORTCODE CONTENT[/SH_TEST]

Функция-обработчик шорткода принимает 3 параметра:

  1. $atts - массив атрибутов, переданных в шорткоде. В нашем случае:

    • $atts['var1'] содержит значение 'somevalue'
    • $atts['var2'] содержит значение 'someothervalue'
  2. $content - строка с содержимым между открывающим и закрывающим тегами шорткода. В нашем случае: - $content содержит THE SHORTCODE CONTENT

  3. $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'; 
}
4 февр. 2013 г. 17:22:04
1

Если вы используете шорткод таким образом, atts[0] будет содержать значение:

add_shortcode( 'test', 'test_callback' );

function test_callback( $atts )
{
    return $atts[0];
}

Другой способ — вызвать значение по имени:

[myshortcode val="myvalue"]

function test_callback( $atts )
{
    return $atts["val"];
}
4 февр. 2013 г. 16:29:48
Комментарии

Не могли бы вы подробнее разъяснить первый процесс, пожалуйста?

Abhik Abhik
4 февр. 2013 г. 18:25:04
0

Лучше сделать это следующим образом:

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>

4 февр. 2013 г. 18:36:50
0

Этот способ работает для меня во всех случаях с использованием [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' );

Надеюсь, это поможет

11 нояб. 2016 г. 19:08:59
7
-2

Сначала вам нужно определить элемент $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) в шорткод.

Код протестирован и работает.

22 июн. 2018 г. 13:31:49
Комментарии

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

fuxia fuxia
22 июн. 2018 г. 16:01:47

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

Andy Macaulay-Brook Andy Macaulay-Brook
22 июн. 2018 г. 18:42:41

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

Amritosh pandey Amritosh pandey
23 июн. 2018 г. 22:17:25

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

Amritosh pandey Amritosh pandey
23 июн. 2018 г. 22:19:06

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

fuxia fuxia
23 июн. 2018 г. 22:20:59

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

Amritosh pandey Amritosh pandey
23 июн. 2018 г. 22:25:37

Любой сайт, который обрабатывает the_content (например, через SEO-плагин) до обработки шаблона, начнёт выдавать ошибки "headers already sent" — это лишь один пример того, что может пойти не так, если шорткод использует echo.

Andy Macaulay-Brook Andy Macaulay-Brook
23 июн. 2018 г. 22:35:08
Показать остальные 2 комментариев