플러그인에서 페이지 템플리트 목록에 옵션을 추가하려면 어떻게해야합니까?


10

플러그인에서 사용자 정의 페이지 템플리트를 작성하는 방법을 찾기 위해 지난 몇 시간 동안 둘러 보았지만 아직 운이 없었습니다.

내가 구체적으로하려고하는 것은 페이지를 편집 할 때 사용 가능한 페이지 템플릿 목록에 옵션을 추가하고 다른 방법을 사용 하지 않는 것입니다if( is_page( 'page-slug' ) ) { /* etc */ }

이를 위해 수정할 수있는 전역 변수가 있습니까?

편집하다:

현재 @ m0r7if3r이 주석으로 작성한 링크를 기반 으로이 코드를 사용하고 있습니다. 문제는 페이지를 볼 때이 기능을 실행하지만 페이지를 편집 할 때 (페이지 템플릿으로 드롭 다운 목록을 채우기 위해) 실행할 수 없다는 것입니다 :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

편집 2 :

이 기능은 향후 업데이트에서 출시 될 것으로 보입니다. 이에 관한 꽤 많은 trac 티켓을 읽었으며 토론이 있었지만 실제 답변은 없습니다 (3.4에 대한 호핑). 여기에 trac 티켓 URL이 조금씩 나열됩니다.

편집 3 :

위 코드는 작동하지만 새 페이지를 편집 / 추가 할 때 드롭 다운 목록에 템플릿이 추가되지 않는다는 점이 유일합니다. 나는 몇 가지 일을 시도하고 있으며 곧 내 질문을 업데이트 할 것입니다.


2
당신은 같은 시도 ?
mor7ifer

@ m0r7if3r (그것을 시도하면 어떻게 작동했는지 메시지를 남겨주세요-감사합니다!)
kaiser

@kaiser 그가 추천 한 코드를 시도했지만 유일하게 누락 된 링크는 메타 상자가 드롭 다운 목록에 템플릿을 추가하는 것입니다 (아는 한!).
Jared

@Jared a의 하단에있는 비슷한 Q와 관련 trac 티켓에 대한 이 답변을 보십시오 . 코드를 광고하십시오) 모든 페이지에 표시되지 않으면 잘못된 후크를 사용하여 인스턴스를 실행하는 것입니다. 어떤 후크를 사용하고 있습니까?
카이저

@kaiser 나는 page_template후크를 사용하고 있으며 위의 편집에서 위의 코드는 현재 사용중인 것입니다. template_redirect후크 를 사용한 다음 page_template필터 를 추가해야 합니까?
Jared

답변:


4

필터? 누군가?

없다 어떤 필터는 도움말이 : page_template_dropdown($template);드롭 다운을 구축하는 데 사용됩니다 그것은 필터링 아니다.

템플릿 배열에 몰래?

드롭 다운 컨텐츠를 빌드하기 위해 핵심 메타 상자는을 사용합니다 get_page_templates(). 내부에서 함수는 다음과 같습니다.

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

그러나 그 시점을 살펴보면 get_themes();템플릿 목록을 가로 챌 가능성이 없습니다. 더 많은 문제는 테마 디렉토리 외부에서 템플릿을 얻을 기회가 없다는 것입니다.

... 테마를 싸워라!

이론과 단점은…

register_theme_directory()템플릿을 배치 할 수있는 추가 테마 디렉토리를 추가하는 데 사용할 수 있습니다 . 따라서 가장 쉬운 방법은 플러그인을 테마 폴더로 등록하는 것입니다.

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

참고 : 이것이 작동하는지 확실하지 않은 곳 입니다.

플러그인 활성화 중 : 그런 다음 폴더 style.css.php안에 파일을 배치해야 templates합니다. 이렇게하면 파일에 변수를 추가 할 수 있습니다. 그런 다음이 변수는 상위 테마가됩니다. 그리고 부모 테마는 단순히 현재 활성화 된 테마 여야합니다. 그런 다음 활성 테마를 플러그인으로 업데이트하십시오.

단점 # 2 : »Appearance«UI 정보… 이 "테마"가 실제 테마로 사용되지 않는다는 메모를 추가하십시오. 나는 "이 테마를 활성화하지 마십시오"의 나머지 부분을 당신의 상상력에 맡깁니다. 어쨌든 : 작동해야합니다.

단점 # 2 :트릭 은 자식 테마를 성공적으로 피합니다. 하나의 부모 테마를 가질 수 있습니다. 더 이상 없습니다.


따라서 비활성 테마에서 사용자 정의 페이지 템플릿을 사용하는 실제 방법이 없다고 생각합니다. 맞습니까? 테마 디렉토리를 등록 할 수 있지만 해당 테마가 활성화되어 있지 않으면 템플릿을 사용할 수 없습니다.
Jared

1
실제로는 아닙니다. 그것은 단지 핵심이 아니며 따라서 핵심이 부족합니다. 당신은 위의 ipstenu에 대한 링크를 시도 했습니까 ? 나는 이미 그 길을 가려고했지만 다른 해결책으로 죽은 길로 끝났습니다. 가장 좋은 방법은 티켓을 따라 가고 어디에서나 티켓을 연결하는 것입니다. : /
kaiser

2

잠재적 인 해결 방법에 대한 제안으로 WordPress 파일 시스템을 사용하여 플러그인에서 현재 활성 테마 디렉토리로 페이지 템플리트 파일을 작성하는 것을 고려 했습니까? 이 프로세스에 대해 얼마나 많은 제어 권한을 원하는지에 따라 플러그인에서 활성화시 파일을 작성하고 제거시 제거하도록 할 수 있습니다. 또는 양식을 사용하여 플러그인 UI 내에서 페이지 템플리트 파일을 동적으로 작성하여 사후 편집 화면의 드롭 다운 상자에 표시 될 페이지 템플리트 이름과 같은 특정 값을 전달할 수 있습니다. 이론적으로 버튼 클릭 한 번으로 플러그인 UI 내에서 페이지 템플릿을 제거하고 다른 목적으로 여러 템플릿을 추가 할 수도 있습니다. 오토 블로그에서 파일 시스템을 사용하는 것에 대한 좋은 소식이 있습니다. 지금 나와 연결되어 있지 않지만 검색 할 수 있습니다.

다음 핵심 릴리스에서 훅을 사용하여 수행하려는 작업을 릴리스하기를 바랍니다.


1
이전과 똑같은 방법이 있었지만 시도했을 때 많은 문제가있었습니다. 사용자가 테마를 전환 할 때 템플릿 파일이 삭제되지 않고 활성 테마를 복사하여 다른 사이트에 배치해야하기 때문에 작동하지 않는 사용자 지정 템플릿 파일을 업로드 할 위험이 있습니다. 나는 그것에 대한 몇 가지 해결 방법이 있다는 것을 알고 있지만 실제로 이것이 자동으로 되기를 원합니다 . 그래도 제안에 +1합니다.
Jared

1
안녕하세요 Jared도 같은 문제에 대해 걱정했습니다. 이 대체 방법을 더 확장 할 수있는 유일한 해결책은 플러그인이 활성화 될 때 현재 테마의 이름을 얻는 것입니다. 사용자가 테마를 비활성화 / 전환하면 해당 테마에서 템플릿 파일을 삭제하고 새로 활성화 된 파일로 다시 쓸 수 있습니다 테마. 테마를 확인하기 위해 자신의 활성화 / 비활성화 후크를 작성한 이 링크를 살펴보십시오 . 약간의 추가 코드를 사용하면 이것이 가능하다고 생각합니다.
Adam

물론, 나는 그것이 효과가 있다고 생각합니다. 나는 그것을 포기하고 내 질문에 결과를 게시 할 것입니다. 링크 주셔서 감사합니다, 그것은 도움이됩니다!
Jared

1

나는 소스를 탐색했고, 놀랍게도 이것을 할 수있는 방법이없는 것 같습니다! 내 제안 해킹은 테마 재정의 / 두 번째 테마 드롭 다운이있는 두 번째 메타 박스를 추가하는 것입니다. 그런 다음이 필터에 연결하십시오.

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

재정의 된 테마 파일을 반환합니다. 물론 원하는 게시물 인 경우에만 add_filter를 사용하고 싶을 것입니다.

화려하고 싶다면 원래 상자를 긁어 다시 만들 수 있습니다 (물론 핵심 코드를 수정하지 않고 필터를 통해).

또한 해당 기능을 요청 하는 trac 티켓을 추가하는 것이 좋습니다 (아직 티켓 이없는 경우).


1
trac에 대한 제안과 동의합니다.
helgatheviking

이미 trac에있는 것 같습니다 : core.trac.wordpress.org/ticket/15803
Jared

1
방금 단일 포스트 유형 템플릿에 대한 다른 Q에 대해 조사했습니다 . 답의 끝에 Trac 티켓을 찾을 수 있습니다. 3.4를 희망 합시다 .
카이저

1

나는 과거에 기본 페이지 템플릿 메타 박스를 제거한 다음 자신의 메타 박스를 추가하여 이것을 달성했습니다. 새로운 메타 박스에 내장 된 get_page_templates를 사용하고 프로그래밍 방식으로 필요한 다른 것을 추가했습니다. 저장시 워드 프레스처럼 페이지 템플리트를 업데이트 할 수 있습니다.


전체 코드를 보여 주시겠습니까? 현재는 거친 개념 일뿐입니다. 감사.
kaiser

1

4.4에서 업데이트 된 3.9 이후에 필터가 추가 theme_page_templatesget_page_templates함수 에서 사용 하는 hook을 확인하십시오 .

apply_filters( 'theme_page_templates', $page_templates, $this, $post );

여기에 더 자세히 설명되어 있습니다 : wordpress.stackexchange.com/a/255820/75495
cjbj

-2

DuckDuckGo의 검색 결과 는 워드 프레스 페이지 템플릿 추가 워드 프레스 사용자 정의 페이지 템플릿 튜토리얼 이라는 wpmu.org 페이지에서 답을 얻었습니다 .

기본적으로 테마 디렉토리 인 wp-content / themes / your-theme 내 에서 기존 페이지 템플리트를 선택한 새 PHP 파일 이름으로 복사하십시오. 파일 상단의 주석에서 "템플릿 이름 :"속성 값을 변경하여 새 파일을 편집하십시오.

그것이 전부였습니다. 이것이 질문을 게시 한 기능 일 가능성이 있습니다. twenty_11 테마로 WP 3.5를 사용하고 있습니다.

테마를 확장하는 더 깨끗한 방법이있을 수도 있습니다. 이와 같은 수정 사항은 테마 업데이트로 덮어 쓸 수 있습니다. Mea Culpa.


테마가 아닌 플러그인에서 드롭 다운 목록에 템플릿을 추가하는 솔루션이 필요합니다. :(
Jared
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.