Làm cách nào tôi có thể thêm tùy chọn vào danh sách Mẫu trang từ Plugin?


10

Tôi đã tìm kiếm trong vài giờ qua để tìm cách tạo một mẫu trang tùy chỉnh từ bên trong một plugin nhưng vẫn chưa có may mắn nào.

Những gì tôi đặc biệt đang cố gắng làm là thêm một tùy chọn vào danh sách các mẫu trang có sẵn khi chỉnh sửa một trang và không sử dụng một số phương pháp khác nhưif( is_page( 'page-slug' ) ) { /* etc */ }

Có một biến toàn cầu tôi có thể sửa đổi để làm điều này?

Biên tập:

Hiện tại tôi đang sử dụng mã này, dựa trên liên kết @ m0r7if3r đã cho tôi nhận xét, vấn đề là nó sẽ chạy chức năng này khi xem trang, nhưng không phải khi chỉnh sửa trang (để điền danh sách thả xuống với các mẫu trang) :

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;
    }

}

Chỉnh sửa 2:

Có vẻ như chức năng này sẽ được phát hành trong một bản cập nhật trong tương lai, tôi đã đọc khá nhiều vé trac về điều này và đã có một số cuộc thảo luận nhưng không có câu trả lời thực sự (hy vọng cho 3,4). Sẽ liệt kê các vé trac URL ở đây một chút.

Chỉnh sửa 3:

Đoạn mã trên hoạt động, NHƯNG, vấn đề duy nhất tôi gặp phải vào thời điểm này là không có mẫu nào được thêm vào danh sách thả xuống khi chỉnh sửa / thêm trang mới. Tôi đang thử một vài thứ và sẽ sớm cập nhật câu hỏi của tôi.


2
Bạn đã thử một cái gì đó như thế này ?
mor7ifer

@ m0r7if3r (Nếu bạn thử điều đó, vui lòng để lại lời nhắn làm thế nào nó hoạt động - Cảm ơn!)
kaiser

@kaiser Tôi đã thử mã mà anh ấy đề xuất, liên kết bị thiếu duy nhất là lấy hộp meta để thêm mẫu vào danh sách thả xuống (theo như tôi biết!).
Jared

@Jared Hãy xem câu trả lời này của tôi với một Q tương tự và các vé trac có liên quan ở dưới cùng của a. Quảng cáo mã của bạn) Nếu nó không hiển thị trên mỗi trang, thì bạn đang sử dụng các móc sai để chạy phiên bản. Bạn đang sử dụng móc nào?
kaiser

@kaiser Tôi đang sử dụng page_templatehook, đoạn mã trên trong phần chỉnh sửa của tôi là những gì hiện đang được sử dụng. Tôi có cần sử dụng template_redirecthook và sau đó thêm page_templatebộ lọc vào đó không?
Jared

Câu trả lời:


4

Bộ lọc? Bất kỳ ai?

Không bộ lọc nào để trợ giúp: page_template_dropdown($template);được sử dụng để xây dựng trình đơn thả xuống và nó không thể lọc được.

Lẻn vào mảng Array?

Để xây dựng nội dung thả xuống, hộp meta lõi sử dụng get_page_templates(). Từ bên trong, chức năng trông như sau:

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

Nhưng khi nhìn vào get_themes();thì có những đường nối không có khả năng chặn danh sách các mẫu. Hơn nữa chúng tôi có vấn đề, rằng không có cơ hội để có được một mẫu từ bên ngoài thư mục chủ đề

... Làm giả một chủ đề!

Lý thuyết và đó là nhược điểm

Bạn có thể sử dụng register_theme_directory()để thêm một thư mục chủ đề bổ sung nơi bạn có thể đặt các mẫu. Vì vậy, điều dễ nhất sẽ là đăng ký plugin của bạn dưới dạng thư mục chủ đề:

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

Lưu ý: Đây là nơi tôi không chắc nó có hoạt động không .

Trong quá trình kích hoạt plugin: Sau đó, bạn nên đặt một style.css.phptệp trong templatesthư mục của mình . Điều này sẽ cho phép bạn thêm các biến vào tập tin của bạn. Biến này sau đó sẽ là chủ đề chính. Và chủ đề gốc nên đơn giản là chủ đề hiện đang hoạt động. Sau đó cập nhật chủ đề hoạt động của bạn vào plugin của bạn.

Nhược điểm # 2: Giới thiệu về »Ngoại hình« UI Có thể thêm một lưu ý rằng "Chủ đề" này không có nghĩa là được sử dụng làm Chủ đề thực tế. Tôi rời khỏi phần còn lại của »Tránh kích hoạt chủ đề này« theo trí tưởng tượng của bạn. Dù sao: Nó nên hoạt động.

Hạn chế # 2: Đây lừa sẽ tránh thành công chủ đề trẻ em. Bạn được phép có một chủ đề phụ huynh. Chỉ có bấy nhiêu thôi.


Vì vậy, tôi đoán rằng không có cách thực tế để sử dụng các mẫu trang tùy chỉnh từ bất kỳ chủ đề không hoạt động, đúng không? Tôi có thể đăng ký một thư mục chủ đề nhưng các mẫu tuy nhiên không có sẵn để sử dụng trừ khi chủ đề đó đang hoạt động.
Jared

1
Không hẳn vậy. Nó chỉ là không nên và do đó là thiếu cốt lõi. Bạn đã thử liên kết đến ipstenu ở trên? Tôi đã thử đi theo con đường đó nhưng kết thúc một cách chết chóc - với một giải pháp khác. Đặt cược tốt nhất sẽ là theo dõi vé, đẩy và liên kết chúng mọi lúc mọi nơi. : /
kaiser

2

Là một gợi ý cho một công việc tiềm năng xung quanh bạn đã xem xét sử dụng hệ thống tệp WordPress để viết tệp mẫu trang từ plugin vào thư mục chủ đề hiện tại của bạn chưa? Tùy thuộc vào mức độ kiểm soát mà bạn muốn đối với quá trình này, bạn có thể yêu cầu plugin của mình ghi tệp khi kích hoạt và xóa tệp khi gỡ cài đặt. Ngoài ra, bạn có thể tạo các tệp mẫu trang một cách linh hoạt từ trong giao diện người dùng plugin của mình bằng cách sử dụng một biểu mẫu để chuyển các giá trị nhất định như tên mẫu trang sẽ xuất hiện trong hộp thả xuống của màn hình chỉnh sửa bài đăng. Về lý thuyết, bạn cũng có thể xóa mẫu trang từ bên trong giao diện người dùng plugin của mình chỉ bằng một nút bấm và thêm nhiều mẫu cho các mục đích khác nhau. Có một bài viết hay về việc sử dụng hệ thống tập tin trên blog của Otto. Tôi không có liên kết với tôi bây giờ nhưng bạn có thể tìm kiếm nó.

Tôi hy vọng họ phát hành những gì bạn dự định làm bằng cách móc trong bản phát hành cốt lõi tiếp theo.


1
Tôi đã có một phương pháp chính xác như cách này hoạt động trước đây nhưng gặp nhiều vấn đề khi tôi thử nó, bởi vì khi người dùng chuyển chủ đề, nó sẽ không xóa tệp mẫu và nếu họ sao chép chủ đề đang hoạt động của họ và đưa nó vào một trang web khác , họ sẽ mạo hiểm tải lên một tệp mẫu tùy chỉnh không hoạt động. Tôi biết có một số cách giải quyết cho điều đó, nhưng tôi thực sự muốn điều này là tự động . +1 cho đề xuất mặc dù.
Jared

1
Xin chào Jared, tôi cũng lo ngại về vấn đề tương tự. Giải pháp duy nhất tôi có thể nghĩ để tiếp tục mở rộng phương pháp thay thế này là sử dụng plugin khi kích hoạt, lấy tên chủ đề hiện tại sau đó nếu người dùng tắt / chuyển chủ đề, bạn có thể xóa tệp mẫu khỏi chủ đề đó và viết lại thành tệp mới được kích hoạt chủ đề. Hãy xem liên kết này nơi anh ta tạo các móc kích hoạt / hủy kích hoạt của riêng mình để kiểm tra các chủ đề. Với một chút mã thêm tôi cảm thấy điều này là có thể.
Adam

Hoàn toàn, tôi nghĩ rằng có thể làm việc. Tôi sẽ cho nó đi và gửi kết quả trong câu hỏi của tôi. Cảm ơn các liên kết, nó giúp!
Jared

1

Tôi đã duyệt qua nguồn, và khá sốc là dường như không có cách nào để làm điều này! Hack được đề xuất của tôi sẽ là thêm một hộp meta thứ hai với phần ghi đè chủ đề / thả xuống chủ đề thứ hai. Sau đó móc vào bộ lọc này:

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

để trả lại tệp chủ đề của bạn nếu nó bị ghi đè. Tất nhiên, bạn chỉ muốn add_filter nếu đó là bài đăng bạn muốn.

Nếu bạn muốn trở nên lạ mắt, bạn có thể loại bỏ hộp ban đầu và tạo lại nó (thông qua các bộ lọc, không sửa đổi mã lõi).

Tôi cũng đề nghị thêm một vé trac yêu cầu chức năng đó (nếu chưa có sẵn cho nó).


1
đồng ý w / đề nghị này cho trac.
xe đạp

Nó dường như đã có trong trac: core.trac.wordpress.org/ticket/15804
Jared

1
Tôi chỉ điều tra điều này cho một Q khác về các mẫu bài đăng đơn . Bạn có thể tìm thấy Vé Trac ở cuối câu trả lời. Hãy hy vọng cho 3,4.
kaiser

1

Tôi đã thực hiện điều này trong quá khứ bằng cách xóa metabox mẫu trang mặc định và sau đó thêm metabox của riêng bạn. Tôi đã có metabox mới sử dụng get_page_temsheet tích hợp và sau đó thêm những cái khác mà tôi cần theo chương trình. Khi lưu, nó có thể cập nhật mẫu trang giống như wordpress.


Bạn có phiền hiển thị mã đầy đủ? Hiện tại nó chỉ là một khái niệm thô. Cảm ơn.
kaiser

1

Kiểm tra hook theme_page_templates, được sử dụng bởi get_page_templateschức năng, bộ lọc được thêm vào từ 3.9 được cập nhật trong 4.4:

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

giải thích đầy đủ hơn tại đây: wordpress.stackexchange.com/a/255820/75495
cjbj

-2

Một kết quả tìm kiếm với DuckDuckGo thêm một mẫu trang wordpress đã đưa ra câu trả lời cho tôi trên trang wpmu.org có tiêu đề Hướng dẫn mẫu trang tùy chỉnh WordPress .

Về cơ bản, bên trong thư mục chủ đề, wp-content / Themes / your-theme , sao chép một mẫu trang hiện có sang một tên tệp php mới mà bạn chọn. Chỉnh sửa tệp mới, chú ý thay đổi giá trị thuộc tính "Tên mẫu:" ma thuật trong nhận xét ở đầu tệp.

Đó là tất cả đã có nó. Có thể đây là một tính năng mà sau ngày câu hỏi. Tôi đang sử dụng WP 3.5 với chủ đề hai mươi_eleven.

Cũng có thể có những cách sạch hơn để mở rộng một chủ đề. Các chỉnh sửa như thế này có thể được ghi đè bằng các cập nhật chủ đề. Mea Culpa.


Tôi cần một giải pháp để thêm mẫu vào danh sách thả xuống từ một plugin, không phải là một chủ đề. :(
Jared
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.