Ответ 1
foreach
будет вашим ответом здесь. По моему мнению, это будет самым простым и чистым. Прежде чем я приведу вам пример кода, проанализируйте свой код и просмотрите все свои недостатки и как мы их исправим.
НЕДОСТАТКИ
-
Никогда не используйте
extract()
.exctract()
создает переменные "на лету", что является проблематичным. Вы не можете должным образом отлаживатьextract()
(если вы даже можете), поэтому, когда он терпит неудачу, вы действительно имеете свою работу, вырезанную для вас, без необходимости. По этим причинам он был полностью удален из ядра и кода. См. билет на трафик 22400. У вас должен быть злой список сquery_posts
иextract()
в двух верхних позициях, что я знаю, насколько плохи эти два. -
Вы не дезинфицируете и не проверяете входные данные, которые могут привести к тому, что хакер вводит jquery в ваш код, чтобы взломать ваш сайт. Никогда не доверяйте никаким данным, которые поступают со стороны пользователя и URL-адреса, он может быть заражен.
-
Как вы уже знаете, взятые из вашего кода, короткие коды не могут не содержать значения массива, значения должны быть строковыми. В вашем случае нам нужно создать массив из строковых значений. Опять же, поскольку вы не можете доверять пользователю не использовать пробелы до запятых или после них, разумно и рекомендуется удалять все пробелы, если они есть, для того, чтобы ваша функция
explode
правильно создала ваш массив -
С помощью этого нового подхода вы должны убедиться, что ваши значения в ваших строках находятся в правильном порядке и что строки являются правильной длиной. Если нет, вы получите неожиданный вывод
Давайте рассмотрим первый короткий код: ( ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ:. Все приведенные ниже коды непроверены. Возможно, они ошибочны или имеют синтаксические ошибки)
internal-menu
//menu
function internal_menu( $atts )
{
$attributes = shortcode_atts(
array(
'href' => '',
),
$atts
);
$output = '',
// Check if href has a value before we continue to eliminate bugs
if ( !$attribute['href'] )
return $output;
// Create our array of values
// First, sanitize the data and remove white spaces
$no_whitespaces = preg_replace( '/\s*,\s*/', ',', filter_var( $attributes['href'], FILTER_SANITIZE_STRING ) );
$href_array = explode( ',', $no_whitespaces );
$output .= '<div id="internalPageMenu">';
$output .= '<ul>';
foreach ( $href_array as $k => $v ) {
// From your code, link 1 is different, so I kept it as is
if ( $k == 0 ) {
$output .= '<li><a href="#' . $v . '"><i class="fa fa-bars"></i>link 1</a></li>';
} else {
$output .= '<li><a href="#' . $v . '">link ' . ($k + 1 ) . '</a></li>';
}
}
$output .= '</ul>';
$output .= '</div>';
return $output;
}
add_shortcode( 'internal-menu', 'internal_menu' );
Затем вы можете использовать короткий код, как показано ниже.
[internal-menu href='jl1, jl2, jl3, jl4']
internal-menu-target
//menu target
function internal_menu_target($atts)
{
$attributes = shortcode_atts(
array(
'id' => '',
'text' => '',
),
$atts
);
$output = '',
// Check if href has a value before we continue to eliminate bugs
if ( !$attribute['id'] || !$attribute['text'] )
return $output;
// Create our array of values
// First, sanitize the data and remove white spaces
$no_whitespaces_ids = preg_replace( '/\s*,\s*/', ',', filter_var( $attributes['id'], FILTER_SANITIZE_STRING ) );
$ids_array = explode( ',', $no_whitespaces_ids );
$no_whitespaces_text = preg_replace( '/\s*,\s*/', ',', filter_var( $attributes['text'], FILTER_SANITIZE_STRING ) );
$text_array = explode( ',', $no_whitespaces_text );
// We need to make sure that our two arrays are exactly the same lenght before we continue
if ( count( $ids_array ) != count( $text_array ) )
return $output;
// We now need to combine the two arrays, ids will be keys and text will be value in our new arrays
$combined_array = array_combine( $ids_array, $text_array );
foreach ( $combined_array as $k => $v )
$output .= '<h3 id="' . $k . '">' . $v . '</h3>';
return $output;
}
add_shortcode('internal-menu-target', 'internal_menu_target');
Вы можете использовать этот короткий код следующим образом:
[internal-menu-target id='1,2,3,4' text='text 1, text 2, text 3, text 4']