sourcecode

워드프레스 쇼트코드 값 배열 전달

copyscript 2023. 2. 7. 20:04
반응형

워드프레스 쇼트코드 값 배열 전달

한 페이지(콘텐츠 섹션이 많고 자체 메뉴가 있는 한 페이지)에서 내부 네비게이션을 제공하기 위한 Word Press 쇼트 코드를 만들고 있습니다.

여기 있습니다.

//menu
function internal_menu($atts) {
  extract(shortcode_atts(array(
   'href1' => '#jl1',
   'href2' => '#jl2',
   'href3' => '#jl3',
   'href4' => '#jl4',
  ), $atts));
  return '<div id="internalPageMenu">
    <ul>
        <li><a href="' . $href1 . '"><i class="fa fa-bars"></i>link 1</a></li>
        <li><a href="' . $href2 . '">link 2</a></li>
        <li><a href="' . $href3 . '">link 3</a></li>
        <li><a href="' . $href4 . '">link 4</a></li>
    </ul>
    </div>';
}
add_shortcode('internal-menu', 'internal_menu');

//menu target
function internal_menu_target($atts) {
  extract(shortcode_atts(array(
   'id' => 'jl1',
   'text' => '',
   ), $atts));
   return '<h3 id="' . $id . '">' . $text . '</h3>';
}
add_shortcode('internal-menu-target', 'internal_menu_target');

내 Wordpress 관리 패널에서 다음을 사용합니다.

[internal-menu]
[internal-menu-target id="jl1"]
Some content
[internal-menu-target id="jl2"]
...etc...

메뉴를 동적으로 만들려면 어떻게 해야 합니까(메뉴가 가질 수 있는 항목 수에 제한되지 않음)?예를 들어 다음과 같은 짧은 코드가 있습니다.

[internal-menu targets="jl1, jl2, jl3, jl4, jl5, ...etc..."]

foreach여기서의 답이 될 것입니다.제 생각에는 그게 가장 쉽고 깨끗할 것 같아요.코드 예를 제시하기 전에 코드를 분석하여 모든 결함을 확인하고 수정 방법을 살펴보겠습니다.

결함

  • 절대 사용 안 함extract().exctract()즉석에서 변수를 생성하여 문제가 됩니다.올바르게 디버깅할 수 없습니다.extract()그래서 실패했을 때, 당신은 불필요하게 당신의 일을 잘 해낼 수 있습니다.이러한 이유로 코어 및 코덱스에서 완전히 제거되었습니다.trac 티켓 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']

문제:

워드프레스 쇼트 코드에는 전달 가능한 데이터 형식에 몇 가지 고통스러운 제한이 있습니다.

공백으로 구분된 변수:

[shortcode a="1 2"]

★★★★★$atts=['a'='"1', 0='2"']

[ ] 에서는 쇼트 코드가 닫힙니다.

[shortcode b=[yay]]

★★★★★$atts=['b'='[yay']

솔루션:

하려면 을 합니다.urlencode():

[shortcode atts=a=1+2&b=%5Byay%5D]

다음과 같이 해석합니다.

parse_string($atts['atts'],$atts);

★★★★★$atts=['a'=>'1 2', b=>'[yay]']

그러면 원하는 어레이를 사용할 수 있습니다.

메뉴 작성에 대해서:

function internal_menu($atts) {
  // allow passing + and ] in the text of the links:
  parse_string($atts["links"],$links);

  // the defaults, verbatim from the question:
  if (!count($links)) $links=[
    'href1' => '#jl1',
    'href2' => '#jl2',
    'href3' => '#jl3',
    'href4' => '#jl4',
  ];

  foreach ($links as $text=>$href) $ul=."<li><a href=\"$href\">$text</a></li>";

  return '<div id="internalPageMenu"><ul>'.$ul.'</ul></div>';
}

add_shortcode('internal-menu', 'internal_menu');

//menu target

function internal_menu_target($atts) {
  // allow passing + and ] in the text:
  if (@$atts[text]) $atts['text']) = urldecode($atts['text']);

  // the defaults, verbatim from the question:
  $atts=array($atts)+['text'=>'','id'=>'jl1'];

  return '<h3 id="' . $link['id'] . '">' . $link['text'] . '</h3>';
}

add_shortcode('internal-menu-target', 'internal_menu_target');

이렇게 먹여줍니다.

[internal-menu links=First+Link=#jl1&Second+Link=#jl2&Google=https://google.com]

[internal-menu-target text=Section+1 id=jl1]

기타.

の b b b 。extract()이치

/* concatenates 3 words of wisdom into a polite policy direction
 *
 * @param $attr: hash of function args
 *          foo = the first word (Kindly)
 *          bar = the second word (ignore)
 *          baz = the third word (totalitarians)
 */

function excellent_policy($attr){
  $defaults=['foo'=>'Kindly', 'bar'=>'ignore', 'baz'=>'totalitarians'];
  extract((array)array_intersect_key($attr,$defaults)+$defaults);
  echo "$foo $bar $baz!";
}

이를 통해 $attr에서 $foo, $bar 및 $baz가 읽기 쉽고 예측 가능한 방법으로 로컬 스코프로 Import되며 이러한 변수가 전달되지 않았을 경우 기본값이 제공되며 예기치 않은 변수가 생성되지 않습니다.

언어 기능을 사용하는 데는 좋은 방법과 나쁜 방법이 있습니다.누군가가 언어 기능을 잘못 사용할 수 있기 때문에 모든 사람이 언어 기능을 사용하는 것을 금지하는 것은 누군가가 젤로를 흡입하려고 할 수 있기 때문에 모든 사람이 숨쉬는 것을 금지하는 것과 같다.

사용하기 쉬운 방법:

[my param="key1=value1&key2=value2"]

쇼트 코드 콜백에서는, 다음의 조작을 실시합니다.

parse_str( str_replace("&amp;", "&", $attrs['param']), $array);
// var_dump( $array );

언급URL : https://stackoverflow.com/questions/31307306/wordpress-shortcodes-pass-array-of-values

반응형