Codex 방법이 수정 된 부모 및 자식 테마 스타일 시트를 큐에 넣는 문제


9

이 포스팅은 내가에서 가져온 스타일 시트 대기열에 포함 방법 주위의 최근 변경에 관한 발견 한 몇 가지 질문이 나타납니다 이 스레드스레드를 .

내가 겪은 문제는 일반적인 사용 사례 시나리오에서 WP 4.0 설치시 특별히 어린이 테마로 준비된 널리 사용되는 잘 관리 된 부모 테마를 사용하여 발생했습니다. 내 자식 테마의 functions.php 만 포함 wp_enqueue_style으로 기능 분과에 설명을 .

아래 참조 된 코드는이 테마에만 적용되지만 대부분은 상위 테마에서 사용하는 현재 코딩 규칙을 사용합니다. 또한 내 관심 분야는 현재 야생에있는 많은 수의 기존 부모 테마에서 복제 할 수 있습니다. 또한, 이러한 제기되는 질문은 사용중인 상위 테마에 관계없이 범용 수준에서 적용 할 수 있습니다.

문제 1 : 투 큐잉

권장 설정 :

부모 테마는 wp_enqueue_scripts후크를 사용하여 스타일과 스크립트를 큐에 넣고 있으며 관련 부분은 다음과 같습니다.

add_action('wp_enqueue_scripts', 'parent_theme_function_name');
function parent_theme_function_name() {
    wp_register_style( 'avia-style' ,  $child_theme_url."/style.css", array(),  '2', 'all' );
    wp_enqueue_style( 'avia-base');
    if($child_theme_url !=  $template_url) { wp_enqueue_style( 'avia-style'); }
}

내 자식 테마 functions.php는 최근 코덱 변경에 따라 스타일을 큐에 넣습니다.

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style' );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
}

참조 코드에서 사용 된 다음 ID를 참고하십시오.

  • id='dm-parent-style-css' 내 자식 테마 함수에 의해 큐에있는 부모 테마의 스타일 시트입니다.
  • id='avia-style-css' 부모 테마 함수가 큐에 넣은 내 자식 테마의 스타일 시트입니다.
  • id='dm-child-style-css' 내 자녀 테마 기능에 의해 큐에 넣은 내 자녀 테마의 스타일 시트입니다.

결과 :

언뜻보기에 <head>는 다음 순서로 표시되었습니다.

<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

플러그인을 설치 한 후 대기열 순서가 다음과 같이 변경되었습니다.

<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->

궁극적으로 플러그인 후에로드 할 자식 테마의 CSS가 필요하므로 자식 테마의 함수에 우선 순위 번호를 추가해야했습니다 (우선 순위 번호에 대한 이전 토론 참조) .

그러나 내 기능은 부모 테마의 CSS 만 대기열에 넣기 때문에 이제 부모 테마 CSS가 끝으로 이동하여 자식 테마의 CSS가 이전보다 훨씬 나빠질 수 있습니다.

<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />

이제 자식 테마 스타일을 대기열로 다시 가져 와서 줄의 맨 앞으로 이동 하여 자식 테마 CSS에 대한 두 개의 대기열에 넣는 문제 (새로운 용어? lol)를 유발해야 합니다 .

더 이상 사용되지 않는 설정 :

자식 테마의 수정 된 기능 :

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style', 99 );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
    wp_enqueue_style( 'dm-child-style', get_stylesheet_directory_uri().'/style.css' );
}

결과 :

다음 순서로 생산 <head>:

<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<link rel='stylesheet' id='dm-child-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

내 기능에 자식 스타일 시트를 포함 시키면 두 번 큐에 넣었지만 IMHO 는 부모 테마가 자식 스타일 시트를 제대로 큐에 넣을 것이라는 가정 하에 코딩보다 선호 됩니다. 각 대기열 스타일에 할당 된 ID를 기반으로 WP Core의 항목이 아닌 상위 테마가 해당 항목을 대기열에 넣는 것으로 보입니다.

내 Shivm :

나는 이것이 권장되는 수단이라고 거의 제안하지 않지만 (그리고이 솔루션에서 신음 할 것보다 더 많은 코딩 경험을 가진 개발자는 확실하다고 확신하지만) 나는 내 자신의 대기열에서 부모 테마의 ID (자식 테마의 스타일을 대기열에 넣는 데 사용)를 대기열에서 제외했습니다. 내 자식 테마의 기능 파일에 다음과 같이 표시됩니다.

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style', 99 );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
    wp_dequeue_style( 'avia-style' );
    wp_enqueue_style( 'dm-child-style', get_stylesheet_directory_uri().'/style.css' );
}

결과 :

이것은 당면한 문제를 해결하여 다음과 같은 결과를 낳았습니다.

<!-- Multiple individual parent theme styles here -->
<!-- Plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<link rel='stylesheet' id='dm-child-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

물론 이것은 부모 테마가 사용하는 ID를 알아야합니다. 표준 자식 테마 개발 방법론으로 사용하려면 좀 더 일반적인 것이 필요합니다.

문제 2 : 재배치 된 자식 스타일 시트

(이것이 다른 스레드에서 나오지 않았다고 생각하기는 어렵지만,보고있을 때 특정 것을 보지 못했습니다 ... 그것을 놓친 경우 자유롭게주의하십시오.)

나는 결코 기본 사용하지 않는 style.css것이 분명히있을 수있다, 그러나 내 모든 실제 스타일은 / CSS / 디렉토리에 .CSS 축소 된 파일로 SCSS에서 컴파일 - 내 테마 스타일의 자식 테마 루트 디렉토리에 있습니다. 나는 이것이 어린이 테마 개발을위한 보편적 인 수준에서 "예상 된 표준" 이 아니라는 것을 알고 있지만 , 내가 알고있는 가장 심각한 WordPress 개발자는 비슷한 것을합니다. 물론 이것은 부모 테마가 대기열에 넣었는지 여부관계없이 내 스타일 시트에 수동으로 해당 스타일 시트를 대기열에 포함 시켜야합니다 .

요약하면 ...

  1. 자식 테마 표준의 관점에서 부모 테마가 자식 테마 스타일을 올바르게 포함한다고 가정하는 것이 안전합니까?
  2. 하위 테마 스타일이 플러그인에 의해 덮어 쓰기 시작될 때 우선 순위를 제거하면 WordPress 커뮤니티의 일부에 더 많은 혼동이 발생할 수 있습니다. 우리는 테마가 스타일을 덮어 쓸 것으로 예상하지만 플러그인으로는 그다지 많지 않습니다.
  3. 실제 하위 테마 스타일에 대해 사용자 정의 스타일 시트를 사용하는 경우 (사전 정의 된 스타일로 배치 style.css하려는 경우) 해당 파일을 수동으로 큐에 넣어야합니다. 광범위한 개발자의 연속성을 유지하는 관점에서 가능한 중복 여부에 관계없이 자식 스타일 시트를 수동으로 큐에 넣는 것이 바람직하지 않습니까?

자녀-부모-테마 관계를 구성하는 방법에 대한 토론이있을 것입니다. 부모 테마에 대해서만 아무 것도 가정하는 것이 안전하지 않다고 생각합니다. 나는 개인적으로 자식 테마에 스타일을 수동으로로드하는 것을 선호합니다. 그러나 이는 자녀 테마의 본질에 대해 결정하고 명확하게 전달해야하는 결정입니다. 자식 테마가 단순한 시각적 조정을위한 것일 경우, 자식 스타일 시트를로드하는 부모가 적합 할 것입니다. 그러나 부모 테마가 프레임 워크이면 스타일 시트를로드하는 자식 테마로 이동합니다.
Seamus Leahy

답변:


5

질문 1

자식 테마 표준의 관점에서 부모 테마가 자식 테마 스타일을 올바르게 포함한다고 가정하는 것이 안전합니까?

일반적으로 그렇습니다. 그러나 절대로 가정 해서는 안됩니다 . 대부분의 재난과 실패는 가정에 근거한 가정 또는 사실에 기인합니다

가정없는 사실

  • 자식 테마의 functions.php가 먼저로드 된 다음 부모의 functions.php가로드됩니다. 이렇게하면 부모 테마의 기본 스타일 시트가 코덱의 업데이트 된 코드에서 자식 테마의 기본 스타일 시트보다 먼저로드됩니다.

  • 번들로 제공되는 주제를 스물 두 번 살펴 보겠습니다. 마법은 여기서 일어난다 wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );. 이것이 메인 스타일 시트가 큐에 들어가는 방법입니다. 테마가 상위 테마로 활성화되면, get_stylesheet_uri()상위 디렉토리의 style.css가 가리키는 대로 부모 테마 에서 style.css가로드됩니다.

  • 자식 테마로 전환 get_stylesheet_uri()하면 자식 테마의 style.css를 가리 키도록 경로가 "변경"됩니다. 이제 wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );부모 style.css 를 로드 하는 대신 자식 style.css가로드됩니다.

  • 부모 테마의 다른 모든 스타일은 작성된 순서대로 정상적으로로드됩니다.

사람들

  • 헤더 템플릿에 직접 추가 된 인라인 스타일 및 스타일 시트. 이 문제에 대해 몇 가지 테스트를 수행했습니다. 상위 스타일 시트가 wp_enqueue_scripts헤더를 사용하여 대기열에 포함되지 않고 직접로드되면 하위 테마의 기본 스타일 시트가 먼저로드됩니다. 여기서 해결 방법으로 이전에 부모의 header.php를 자식 테마에 복사하고 해당 호출을 제거하는 것이 좋습니다. 그런 다음 OP 및 감가 상각 함수 에서 설명한대로 부모 및 자식 테마 스타일과 header.php에 직접로드 된 다른 스타일 시트를 모두 큐에 넣어야합니다.

  • 스타일과 스크립트가 헤더에 직접로드되는 위치를 한두 번 보았습니다.이 때문에 호출 wp_head이 생략됩니다. 이렇게하면 조용히 대기열에 넣을 수 없으므로 스타일이 표시되지 않습니다.

  • 우선 순위가 잘못 설정되었습니다. enqueueu 함수를 연결할 때 우선 순위를 설정할 필요는 없습니다. 둘 다 기본 우선 순위가 같으면 선착순 규칙이 적용됩니다. 로드 순서가 올바른지 확인합니다.

부모 테마 저자에 대한 참고 사항

테마에 스타일과 스크립트를 추가하는 데 허용되는 적절한 방법은 wp_enqueue_scripts작업 후크를 통하는 것 입니다. 절대로 헤더 템플릿에 직접 스타일과 스크립트를 추가하지 않으며, 함수를 후킹 할 때 당신의 행동에 어떤 우선 순위를 설정하지 않습니다

항상 다음과 같이 기본 스타일 시트를로드하십시오.

wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );

이렇게하면 자식 테마를 사용할 때 자식의 기본 스타일 시트가로드됩니다.

어린이 테마 작가로서의 귀하의 책임

  • 부모 테마를 통해 시간을내어 작업하십시오. 부모 테마를 알고 테마 구조에 익숙하고 테마에서 함수와 후크가 사용되는 방식을 확인하십시오. 부모 테마의 작동 방식에 대한 내부 지식이 없으면 성공적인 자식 테마를 만들 수 없습니다. 코드가 예상대로 작동하려면 스타일과 스크립트가 올바르게로드되어 있는지 확인해야합니다.

  • 부모 테마 작성자에게 항상 마음에 들지 않는 코드를 알려주십시오. 예를 들어, 작성자가 자신의 스타일을 헤더에 직접 추가 한 경우이를 알리고 이것이 잘못된 방법임을 알리고 향후 릴리스에서이를 수정하도록 요청하십시오.

질문 2

하위 테마 스타일이 플러그인에 의해 덮어 쓰기 시작될 때 우선 순위를 제거하면 WordPress 커뮤니티의 일부에 더 많은 혼동이 발생할 수 있습니다. 우리는 테마가 스타일을 덮어 쓸 것으로 예상하지만 플러그인으로는 그다지 많지 않습니다.

불행히도 이것을 방지하는 직접적인 방법은 없습니다. 여기서 중요한 점은 플러그인 스타일이 최종 사용자의 동의없이 기본 테마 스타일을 덮어 쓰지 않아야한다는 것입니다. 내 생각에, 이것은 플러그인 작성자의 나쁜 습관이나 부정입니다. 이 경우 플러그인 작성자에게 연락하여 이에 대해 경고하도록 제안하십시오.

또한 필요하지 않은 스타일 (및 스크립트)을 삭제 및 등록 취소하거나 위 코드에서와 같이 우선 순위를 변경하고 다시 대기열에 추가하고 다시 등록해야하는 옵션이 항상 있습니다 (완벽합니다). shivm 에 대한 참고 사항만으로 스타일과 스크립트 를 대기열에서 제거 하고 등록을 해제하는 것이 가장 좋습니다 .

질문 3

실제 하위 테마 스타일에 대해 사용자 정의 스타일 시트를 사용하는 경우 (사전 정의 된 style.css에 배치하려는 경우) 해당 파일을 수동으로 큐에 넣어야합니다. 광범위한 개발자의 연속성을 유지하는 관점에서 가능한 중복 여부에 관계없이 자식 스타일 시트를 수동으로 큐에 넣는 것이 바람직하지 않습니까?

이 문제에 대한 직접적인 흑백 답변이 없다고 생각합니다. 나는 행동으로 결정되는 특정 지침 내에있는 한 편안하게 행동하십시오.

스타일 시트는 기능을 추가하기위한 것이 아니라 사용자에게 시각적 경험을 추가하기위한 것입니다. 스타일은 처리 된 그대로 브라우저로 그대로 전송됩니다. 워드 프레스는 여기서 아무런 역할을하지 않습니다.

이 사실을 바탕으로, 스타일 시트를 두 번로드 할 때 위협적인 적신호가 보이지 않습니다. 그러나 성능에 몇 밀리 초가 소요될 수 있습니다. 솔직히 말하면, 다른 브라우저에서 중복이 어떻게 처리되는지 확실하지 않습니다. 이것은 독자로서 가서 테스트 할 수있는 것입니다.

IMHO, 중복은 결코 좋지 않으며 항상 피해야합니다. 어떤 이유로 든 자녀의 기본 스타일 시트를 수동으로 대기열에 넣으려면 shivm 에서 코드를 사용해야한다고 제안합니다 . 기본적으로 추가 된 복제본을 대기열에서 빼고 등록을 취소 한 다음 스타일 시트를 정상적으로 다시 대기열에 넣습니다.

한 가지만 기억해야 할 사항은, enqueue 및 register 함수에 사용할 수있는 $dependancy매개 변수가 있습니다. 따라서 보조 스타일 시트를 쉽게로드하고 하위 테마의 기본 스타일 시트에 종속되게 할 수 있습니다.

결론적으로

최근 코덱이 업데이트 된 이후 피드백이 놀라웠으며 이에 대한 모든 사람의 의견에 감사드립니다. 모든 사람이이 질문에 대한 모든 유형의 피드백에 참여하도록 독려하고 싶습니다. 추가하거나 의견이 있으시면 알려주세요.


Pieter, 철저한 답변 감사합니다. 오늘 늪에 빠졌지 만 오늘 저녁에 추가 할 내용에 대해 몇 가지 생각을했습니다.
dMcClintock 2013

이렇게하십시오. 나는 이것에 대한 다른 생각을 정말로 듣고 싶습니다. 내 대답은 내 테스트를 기반으로 한 내 의견이므로 알파와 오메가는 아닙니다. 당신의 통찰력을 기대합니다 :-)
Pieter Goosen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.