shortcode_atts – одна переменная URL не работает

Я разработал небольшой плагин на основе короткого кода. Вот урезанная версия кода для самого короткого кода:

function lishortcode($liatts) { extract(shortcode_atts(array( "li" => get_option('li'), ), $liatts)); foreach ($liatts as $key => $option) { $li[$key] = $option; } $lib=$li[URL]; return $lib; } add_filter('widget_text', 'do_shortcode'); add_shortcode('LI', 'LIshortcode'); 

Параметр URL является одной из 5 переменных, называемых в коротком коде. Все остальные работают, кроме этого. Для этого есть причина? Следующие два коротких кода выдают один и тот же URL:

 [LI] [LI URL="http://www.differenturl.com/somewhere"] 

Solutions Collecting From Web of "shortcode_atts – одна переменная URL не работает"

Прежде всего, вы правильно используете extract / shortcode_atts :

Линия:

  extract(shortcode_atts(array( "li" => get_option('li'), ), $liatts)); 

использует shortcode_atts а затем извлекает каждый ключ в returnarray в свою собственную переменную: например, $li в этом примере. Но вы все равно продолжаете использовать $liatts – это всего лишь атрибуты, переданные из $liatts и могут содержать что угодно . Кроме того, он не имеет каких-либо дефолтов.

Судя по вашему примеру, вы хотите сделать что-то вроде:

 function lishortcode($liatts) { //Merge provide attributes with defaults. Whitelist attributes $atts = shortcode_atts(array( "url" => get_option('li'), "foo" => "bar" ), $liatts)); /* Url is in $atts['url']. Do something and then return something */ return $atts['url']; } add_filter('widget_text', 'do_shortcode'); add_shortcode('LI', 'lishortcode'); 

См. Codex , – note shortcode_atts() не только предоставляет значения по умолчанию для отсутствующих значений, но также удаляет любые атрибуты, которые вы не укажете. В приведенном выше примере атрибут 'url' и 'foo' будет присутствовать в $atts .

Если вы включите отладку – define('WP_DEBUG',true); в вашем wp-config.php – вы увидите, что в этом коротком коде есть несколько вещей.

Я должен начать с того, что ничего не возвращается, когда я пытаюсь выполнить код. Я предполагаю, что это потому, что у меня нет ключа «li» в моей таблице *_options , и вы не объяснили, какие значения находятся в этом ключе. (Это очень плохое ключевое имя, кстати, слишком короткое и общее)

Я рискну предположить, что проблема здесь: $lib=$li[URL]; Вы не устанавливаете константу «URL» в любом месте, поэтому PHP начинает гадать. Если вы ожидаете, что это атрибут URL вашего короткого кода, вы ошибаетесь, главным образом потому, что ваши атрибуты имеют строчные буквы. Это происходит независимо от того, хотите вы этого или нет :

ВАЖНЫЙ СОВЕТ. Не используйте camelCase или UPPER-CASE для ваших имен атрибутов $ atts. Значения $ atts ниже обрезаются во время shortcode_atts (array ('attr_1' => 'attr_1 default', // … и т. Д.), $ Atts ), поэтому вы можете просто использовать нижний регистр.

Я предполагаю, что вам нужно $lib=$li['url'];

 function lishortcode($liatts) { // $liatts here is an array( 'URL' => "http://www.differenturl.com/somewhere" ) extract(shortcode_atts(array("li" => get_option('li'),), $liatts)); // the extract() would convert the $liatts array to variables; // in this case $URL with a value of "http://www.differenturl.com/somewhere" // shortcode_atts() here filters the array $liatts before the extract // in this case you're telling it to filter out any key other than 'li' // if no li key exists use the default value retrieved with the get_option() // since your shortcode example doesn't contain a 'li' you'll end up with a single // value of $li with the default value from the get_option() call foreach ($liatts as $key => $option) { $li[$key] = $option; } // With the example provided there is no point to this foreach loop $lib=$li[URL]; return $lib; // return the default value of $li[URL], assuming that it had a value. } 

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

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