source

WordPress의 하위 테마에서 위젯을 재정의하려면 어떻게 해야 합니까?

gigabyte 2023. 2. 23. 22:51
반응형

WordPress의 하위 테마에서 위젯을 재정의하려면 어떻게 해야 합니까?

부모 테마에 있는 PHP 파일을 간단하게 수정하고 싶습니다.

wp-content\themes\sailing\inc\widgets\gallery\tpl\base.php

그래서 나는 내 아이 테마에 같은 폴더 구조를 만들고 이 파일에서 내가 필요한 수정을 했습니다.또한 이 위젯을 선언하는 데 필요한 모든 PHP 파일을 복사/붙여넣었습니다.

wp-content\themes\sailing\inc\widgets\widgets.php  
wp-content\themes\sailing\inc\widgets\gallery\gallery.php

wp-content\themes\sailing-child\inc\widgets\widgets.php  
wp-content\themes\sailing-child\inc\widgets\gallery\gallery.php

내가 뭘 놓쳤지?

WordPress 하위 테마는 이 방식으로 작동하지 않습니다.하위 테마에서 동일한 경로를 사용하여 재정의할 수 있는 유일한 파일은 "기본" 파일인 index.php, 페이지입니다.php, style.css...대부분 템플릿 파일입니다.

하위 테마에서 함수 또는 클래스를 재정의하는 경우.몇 가지 방법으로 해결할 수 있습니다.

  1. 기능/기능을 재검토하다
  2. 기능/기능 복제

다만, 테마가 어떻게 작성되어 있는지, 「자녀 테마」에 대응하고 있는지에 따라 다릅니다.당신의 위젯 문제를 살펴봅시다.

상위 테마 내에서 위젯 선언 파일을 열면 다음과 같은 내용이 표시됩니다.

class Widget_Name extends WP_Widget {
...
CODE OF THE WIDGET
...

참조: https://codex.wordpress.org/Widgets_API

위의 행을 먼저 보는 것이 아니라 다음과 같은 경우가 가장 좋습니다.

if(!class_exists('Widget_Name')) {
    class Widget_Name extends WP_Widget {
    ...
    CODE OF THE WIDGET
    ...

즉, 파일을 복사/붙여넣기만 하면 정상적으로 작동합니다.위젯은 상위 위젯을 덮어쓰고 상위 위젯이 실행되지 않으므로 오류가 발생하지 않습니다.그게 바로 "아이 테마 준비 완료" 주제입니다.이것은 기능에서도 마찬가지입니다(주의해 주세요.if(!function_exists('function_name')).

잊지 말고 다음에서 파일을 호출해 주세요.child-theme/functions.php디폴트로는 호출되지 않습니다.

예를 들어 다음과 같습니다.

require_once('path/to/your/widget_class.php');

또는 class_exists 호출이 없는 경우 파일을 복제하기만 하면 됩니다.require_once를 사용하여 호출합니다.같은 클래스를 2회 정의하기 때문에 오류가 표시됩니다.PHP는 치명적인 오류를 허용하지 않습니다.

이름 바꾸기:

class Widget_Name2 extends WP_Widget {

그리고 파일 어딘가에서 (대부분 마지막에)register_widget(클래스 이름을 편집합니다.

register_widget( 'Widget_Name2' );

같은 위젯을 2배 사용할 수 있기 때문에 가장 편리한 방법은 아닙니다만, 그래도 동작합니다.

따라서 @2Fwebd의 답변은 (댓글에 표시된 것처럼) 다소 불완전하기 때문에, 보다 완전한 답변이 있습니다(답변이나 코멘트보다 알기 쉽게 하기 위해서). 나는 그의 답변에 대해 편집을 제안했지만 받아들여지지 않았지만, 여기 더 완전한 답변이 있습니다.

WordPress 하위 테마는 이 방식으로 작동하지 않습니다.하위 테마에서 동일한 경로를 사용하여 재정의할 수 있는 유일한 파일은 "기본" 파일인 index.php, 페이지입니다.php, style.css...대부분 템플릿 파일입니다.

하위 테마에서 함수 또는 클래스를 재정의하는 경우.몇 가지 방법으로 해결할 수 있습니다.

  1. 기능/기능을 재검토하다
  2. 기능/기능 복제

다만, 테마가 어떻게 작성되어 있는지, 「자녀 테마」에 대응하고 있는지에 따라 다릅니다.당신의 위젯 문제를 살펴봅시다.

상위 테마 내에서 위젯 선언 파일을 열면 다음과 같은 내용이 표시됩니다.

class Widget_Name extends WP_Widget {
...
CODE OF THE WIDGET
...

참조: https://codex.wordpress.org/Widgets_API

위의 행을 먼저 보는 것이 아니라 다음과 같은 경우가 가장 좋습니다.

if(!class_exists('Widget_Name')) {
    class Widget_Name extends WP_Widget {
    ...
    CODE OF THE WIDGET
    ...

즉, 파일을 복사/붙여넣기만 하면 정상적으로 동작합니다.위젯은 상위 위젯을 덮어쓰고 상위 위젯이 실행되지 않으므로 오류가 발생하지 않습니다.그게 바로 "아이 테마 준비 완료" 주제입니다.기능)도입니다.if(!function_exists('function_name')를 참조해 주세요.

자녀 테마/함수에서 파일을 호출하는 것을 잊지 마십시오.php 파일은 기본적으로 호출되지 않습니다.

예를 들어 다음과 같습니다.

require_once('path/to/your/widget_class.php');

또는 class_exists 호출이 없는 경우 파일을 복제하기만 하면 됩니다.require_once를 사용하여 호출합니다.같은 클래스를 2회 정의하기 때문에 오류가 표시됩니다.PHP는 치명적인 오류를 허용하지 않습니다.

이름 바꾸기:

class Widget_Name2 extends WP_Widget {

다음를 id_base로 .parent::_construct 아이디 (으)ㄹㄹㄹㄹㄹㄹㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴ.

parent::__construct( 'new_uniq_id', 'name of your widget', ...)

또한 파일 어딘가에서(대부분 마지막) register_widget()을 찾아 클래스 이름을 편집합니다.

register_widget( 'Widget_Name2' );

같은 위젯을 2배 사용할 수 있기 때문에 가장 편리한 방법은 아닙니다만, 그래도 동작합니다.

도움이 됐으면 좋겠는데

언급URL : https://stackoverflow.com/questions/40961370/how-to-override-a-widget-in-a-child-theme-in-wordpress

반응형