타사가 $ wp_scripts / $ wp_styles-> add_data를 사용해야합니까?


31

WP_Dependencies클래스 내에 라는 메소드가 add_data있습니다. 이 기능은 워드 프레스로드 중에 대기열에 있던 스크립트 / 스타일에 데이터를 추가합니다. 이 기능에 대해 일반적으로 인용되는 용도는 다른 버전의 IE를 대상으로하는 스타일 시트를 추가 할 때 조건부를 추가하는 것입니다. 예를 들어 IE8 이하를 타겟팅하려면 다음을 수행하십시오.

function test_wp_print_styles() {
    global $wp_styles;

    wp_enqueue_style( 'test-style', get_template_directory_uri() . '/css/test.css', array(), 1, 'all' );
    $wp_styles->add_data( 'test-style', 'conditional', 'lte ie8' );
}
add_action( 'wp_print_styles', 'test_wp_print_styles' );

이것은 다음과 같이 렌더링됩니다 :

<!--[if lte ie8]>
<link rel='stylesheet' id='test-style-css'  href='http://trunkosaurus.dev/wp-content/themes/twentyeleven/css/test.css?ver=1' type='text/css' media='all' />
<![endif]--> 

Core를 살펴보면이 방법이 사용되는 소수의 장소가 있습니다.

  • WP_Styles->add_inline_style(): 참조 된 스타일 시트 뒤에 인라인 스타일을 추가합니다 (를 통해 수행 WP_Styles->print_inline_style()).

  • WP_Scripts->localize(): json으로 인코딩 된 객체를 추가합니다 ( "공개" wp_localize_script()함수로 래핑 됨 )

  • wp_plupload_default_settings() : 'wp-plupload'스크립트에 json으로 인코딩 된 객체 (다차원 배열에서 생성)를 추가합니다 (3.4에서 제공됨).

  • 스크립트 및 스타일을 등록 / 큐에 넣을 때 기본 스크립트에 대한 데이터 추가 ( wp-includes/script-loader.php)

분석법의 사용을 통해 읽었을 때 특정 사용 사례가없는 것으로 보입니다. 에서 wp_plupload_default_settings임의의 데이터 주입이 가능한 것 같습니다. 에서 wp_register_script헤더와 바닥 글 스크립트를 구분하는 데 사용되는 것 같습니다. 에서 add_inline_style, 지정된 스타일 시트가 큐에 후에 추가되어야 인라인 스타일을 표시하는 데 사용됩니다.

이 함수를 잘 사용하려면 다음 코드와 같이 외부 스크립트를 대기열에 넣었지만 일부 구성 변수를 보내야합니다. 일부 구성 변수는 DB에서 제공됩니다.

function zdt_enqueue_add_this() {
    global $wp_scripts;

    wp_enqueue_script( 'zdt-add-this', 'http://s7.addthis.com/js/250/addthis_widget.js#pubid=myidhere' );

    // Contrived example of database call to get a twitter handle stored in the db
    $author_twitter_handle = zdt_get_twitter_handle();

    $js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n";
    $js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };';

    $wp_scripts->add_data( 'zdt-add-this', 'data', $js );
}
add_action( 'wp_enqueue_scripts', 'zdt_enqueue_add_this' );

결과는 다음과 같습니다.

<script type='text/javascript'>
/* <![CDATA[ */
var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } };
var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };
/* ]]> */
</script>
<script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script>

객체가 속성 내에 속성을 가지고 wp_localize_script있기 때문에이 작업을 수행 할 수 없다는 점에 유의하십시오 addthis_share( 이 전에는 다소 해킹적인 방법으로 작성했습니다 ).

편집 : 나는 이것을 진술하는 데 잘못되었습니다. wp_localize_script다차원 배열을 잘 처리합니다.

이 방법은 다음과 같은 이유로 실제로 잘 작동하는 것 같습니다.

  1. 데이터를 스크립트 핸들에 첨부 할 수 있으므로 항상 스크립트에 올바르게 대기열에 포함됩니다. 또한 스크립트 대기열 해제, 스크립트 순서 및 스크립트 배치에 대해 지능적입니다.
  2. PHP를 사용하여 var를 JS에 보낼 수 있습니다.
  3. wp_print_styles대기열에 넣은 스크립트가 나중에 수행하는 임의의 스크립트를 인쇄하는 데 사용 하는 것보다 더 체계적으로 보입니다 .

이 방법에 대해 걱정하는 예상대로 작동하지 않는 것이 있습니다. 이러한 문제 중 하나 wp_localize_script는와 함께 사용 $wp_scripts->add_data하면 예기치 않은 결과를 얻을 수 있다는 것입니다. 예를 들어 :

// Contrived example of database call to get a twitter handle stored in the db
$author_twitter_handle = zdt_get_twitter_handle();

$js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n";
$js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };';

$wp_scripts->add_data( 'zdt-add-this', 'data', $js );
wp_localize_script( 'zdt-add-this', 'addthis_share', array( 'var' => 'val' ) );

생산 :

<script type='text/javascript'>
/* <![CDATA[ */
var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } };
var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };
var addthis_share = {"var":"val"};
/* ]]> */
</script>
<script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script>

이 스크립트는 다음과 같습니다.

// Contrived example of database call to get a twitter handle stored in the db
$author_twitter_handle = zdt_get_twitter_handle();

$js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n";
$js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };';

wp_localize_script( 'zdt-add-this', 'addthis_share', array( 'var' => 'val' ) );
$wp_scripts->add_data( 'zdt-add-this', 'data', $js );

생산 :

<script type='text/javascript'>
/* <![CDATA[ */
var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } };
var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };
/* ]]> */
</script>
<script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script>

data가 설정 키 wp_localize_script궁극적으로 호출에 의해 덮어 쓰기를합니다 $wp_scripts->add_data, 당신이 호출하면 반면 wp_localize_script같은 스크립트를 두 번, 문자열이 제대로 연결된 것입니다.

이 모든 것이 대기열에 넣은 스크립트와 함께 사용할 임의의 스크립트를 인쇄하는 편리한 방법이지만 충돌 가능성으로 인해 널리 사용해서는 안된다고 생각합니다. 커뮤니티 플러그인 / 테마에서 코드가 사용되지 않는 개인 프로젝트에서 이것을 사용하는 것에 대한 논쟁을 확실히 볼 수 있습니다.

또한 기능의 목적에 대한 단서가 있는지 Core Trac을 살펴 보았습니다. 임의의 JS를 추가하는 다른 방법을 모색 한 티켓 (http://core.trac.wordpress.org/ticket/11520) (서사시 하나)을 발견했습니다. 따라서 임의의 JS를 추가하는 더 좋은 방법을 만드는 데 관심이있는 것 같지만 add_data프로세스의 일부 여야 하는지 확실하지 않습니다 .

내 주요 질문은 : 개발자 가이 기능을 사용해야합니까? 경우에 따라 (예 wp_register_script:) 제 3자가 사용해서는 안되는 "개인"기능처럼 보입니다. 그러나 다른 경우 (예 wp_plupload_default_settings:)에는 대기열에 포함 된 스크립트 전에 임의의 JS를 주입하는 것이 가장 합리적인 방법 인 것 같습니다.

나는 이것에 대한 "올바른"대답이 없다고 생각하지만 다른 개발자들이 생각하는 것을 듣고 싶습니다. 또한이 퍼즐에는 내가 완전히 무시한 부분이 있으며 다른 사람들이 그것에 대해 말하는 것을 듣고 싶어한다고 생각합니다.

답변:


4

이 기능은 워드 프레스로드 중에 대기열에 있던 스크립트 / 스타일에 데이터를 추가합니다.

실제로는 아닙니다. 이전의 스크립트 / 스타일에 데이터를 추가합니다 registered.

로 설정된 데이터 키 wp_localize_script는 궁극적으로에 대한 호출로 덮어 $wp_scripts->add_data쓰지만 wp_localize_script동일한 스크립트에 대해 두 번 호출 하면 문자열이 올바르게 연결됩니다.

권리. 둘 다 기본 (액세스 할 수없는 내부) API를 호출하므로 언급 한대로 덮어 씁니다. 호출 할 때 발생합니다 $this->get_data( $handle, 'data' );.

의문

내 주요 질문은 : 개발자 가이 기능을 사용해야합니까?

대답

간단히 말해 : 예, 필요한 것을 할 수있는 다른 기회가 없을 때.

다른 예 : 스크립트가 등록되었는지 확인 (예 json2/jquery:)하고 바닥 글로 이동하십시오 (확인 extra['group']).

// Move scripts to the footer - in case it isn't already there
if ( ! $wp_scripts->get_data( 'json2', 'group' ) )
    $wp_scripts->add_data( 'json2', 'group', 1 );

if ( ! $wp_scripts->get_data( 'jquery', 'group' ) )
    $wp_scripts->add_data( 'jquery', 'group', 1 );

참고 :이 ↑는 extra!

추가 사항

반대 질문 : 코어에서 등록한 스크립트에 종속성을 추가하려고 시도한 적이 있습니까? 예를 들어 : JSON2필요에 따라 깊이를 추가하십시오 jQuery. 이것은 가로 채지 않고는 불가능합니다 global $wp_scripts.

global $wp_scripts;

$scripts = array( 
     'jquery'      => array( 'json2' )
    ,'jquery-form' => array( 'json2' ) 
);

foreach ( $scripts as $handle => $deps )
{
    // Ugly hack: Intercept the global to force the "natural"/needed order: JSON2 » jQuery
    $deps_default =& $wp_scripts->registered[ $handle ]->deps;
    $wp_scripts->registered[ $handle ]->deps = array_merge( $deps_default, $deps );
}

수업이 할 수없는 일이 많이 있습니다. 같은 것을 사용하는 그래서 ->add_data()입니다 IMO 완전히 유효합니다. 핵심 수업이 부족한 채 생활하는 것이 더 낫기 때문에 얻은 ​​것을 사용하십시오.


"핵심이 기본 및 내장 스크립트에 종속성을 추가 할 수있을 때까지 기다리십시오"trac에서 티켓을 열었습니까?
scribu

@ scribu 고마워요, 아니에요. 모든 티켓은 단순히 썩어 버렸으므로 trac 티켓에 대한 투자 노력에서 물러났습니다. 그것은 지금까지 경험 한 바에 의한 결론이 아닙니다. 그러나 당신과 논쟁을 시작하지 않기 위해, 나는 플러그인 중 하나의 간단한 복사 / 붙여 넣기에서 남았으므로 제거 할 것입니다.
카이저

그렇다면 jQuery 전에 JSON2를로드하면 어떤 이점이 있습니까?
scribu

추상적 인 예이므로 아무것도 아닙니다. 좀 더 자세한 예제를 찾으려면 라이브러리가 필요 JSON2하지만 이전에로드해야하는 라이브러리 하나를 상상할 수 jQuery있습니다 UberjQuery. Btw : 코어를 파고 들면서 꽤 잘 지내면서 시간을내어 답을 쓰지 않겠습니까? 시간을 읽는 것이 가치가 있다고 생각합니다.
카이저

당신의 생각 Kaiser에 감사드립니다! "API"가 지원하는 JS를 추가하는 방법을 찾고 있습니다. 모든 종류의 작업을 수행하기 위해 구부릴 수 있다는 것을 알고 있지만 코드가 불안정해질 수 있습니다. 그것이 할 수있는 것보다 그것이 무엇을위한 것인지 아는 것이 좋으며, 확실히 그것으로 많은 것을 할 수 있습니다.
tollmanz

1

WP 3.3에는 스크립트 데이터를 처리하는 방법에 대한 큰 논쟁이있었습니다.

http://core.trac.wordpress.org/ticket/11520

중첩 배열을 지금 전달할 수 있습니다wp_localize_data() .

wp_localize_script( 'jquery', 'jQueryL10n', array(
    'foo' => array(
        'bar' => array( 'apple', 'orange' )
    ),
) );

따라서 연결이 add_data()필요한 경우와 같은 일부 경우에 동작이 변경 될 수 있다는 점을 이해하고 필요한 고급 API가없는 경우에 사용 합니다.


입력 Scribu에 감사드립니다! 그 티켓에 연결하는 것이 재밌습니다! 나는 내 게시물에서 그것에 연결했지만, 다차원 배열이 현재 지원된다는 것을 알지 못했을 정도로 많은 일이있었습니다.
tollmanz

하 ... 좋은 편집! 나는 생각했던 것처럼 그 티켓에 혼동되지 않았다.
tollmanz

@ tollmanz 그래, 특히 당시에 IRC에 없었다면 꽤 혼란 스럽다.
scribu

@ungestaltbar 씨는 몇 달 전에 다차원 배열을 추가하는 방법을 보여주었습니다. 이것이 이미 핵심이라는 것을 몰랐습니다.
카이저

@scribu-이미 다차원 배열을 지원하지 않습니까? -적어도 나는 아무 문제없이 사용합니다 ...
Stephen Harris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.