Як я можу додати параметр до списку шаблонів сторінок із плагіна?


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:

Здається, що ця функціональність буде випущена в майбутньому оновлення, я прочитав досить багато проїзних квитків з цього приводу, і було певне обговорення, але реальної відповіді немає (сподіваючись на 3.4). Перелічимо тут трохи URL-адрес проїзних квитків.

Редагувати 3:

Код, що знаходиться вище, працює, АЛЕ, єдине питання, яке у мене виникає на даний момент, - це те, що жоден шаблон не додається до випадаючого списку під час редагування / додавання нової сторінки. Я намагаюся кілька речей і незабаром оновлю своє питання.


2
Чи намагалися ви що - щось на зразок цього ?
mor7ifer

@ m0r7if3r (Якщо ви спробуєте це, будь ласка, залиште повідомлення про те, як це вийшло - Дякую!)
kaiser

@kaiser Я спробував код, який він рекомендував, єдине відсутнє посилання - це отримати мета-поле, щоб додати шаблон до випадаючого списку (наскільки я знаю!).
Джаред

@Jred Подивіться на цю відповідь, яку я отримав, на аналогічний Q та пов'язані з ним квитки на проїзд у нижній частині а. Розмістіть свій код) Якщо він відображається не на кожній сторінці, ви використовуєте неправильні гачки для запуску екземпляра. Які гачки ви використовуєте?
кайзер

@kaiser Я використовую page_templateгачок. Код, який описано вище в редагуванні, - це те, що використовується зараз. Чи потрібно використовувати template_redirectгачок, а потім додати там page_templateфільтр?
Джаред

Відповіді:


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: Про інтерфейс «Зовнішній вигляд»… Можливо, додайте примітку, що ця «Тема» не повинна використовуватися як фактична Тема. Я залишаю решту »Уникайте активізації цієї теми« для вашої фантазії. У будь-якому випадку: це має працювати.

Недолік №2: Цей трюк вдало уникне дочірніх тем. Вам дозволяється мати одну батьківську тему. Нічого більше.


Тож я здогадуюсь, що немає фактичного способу використання власних шаблонів сторінок з будь-якої неактивної теми, правда? Я можу зареєструвати каталог тем, проте шаблони не доступні для використання, якщо ця тема не активна.
Джаред

1
Не зовсім. Це просто не повинно бути, а отже, відсутністю ядра. Ви випробували посилання на ipstenu вище? Я вже намагався пройти цей маршрут, але закінчився мертвим шляхом - з іншим рішенням. Найкраще було б стежити за квитками, натискати та зв’язувати їх де б ви не були. : /
кайзер

2

Як пропозиція щодо потенційної проблеми, чи розглядали ви, використовуючи файлову систему WordPress, щоб записати файл шаблону сторінки зі свого плагіна до поточного каталогу активних тем? Залежно від того, який рівень контролю над цим процесом ви можете мати, ваш плагін може написати файл під час активації та видалити його під час видалення. Крім того, ви можете динамічно створювати файли шаблонів сторінок із внутрішнього інтерфейсу плагіна, використовуючи форму для передачі певних значень, таких як ім'я шаблону сторінки, яке має відображатися у спадному вікні екрана редагування публікацій. Теоретично ви також можете видалити шаблон сторінки з інтерфейсу вашого плагіна одним натисканням кнопки та аналогічно додати кілька шаблонів для різних цілей. У блозі Отто є хороший пост щодо використання файлової системи. Зараз у мене немає зв’язку зі мною, але ви можете шукати його.

Я сподіваюся, що вони випустять те, що ви мали намір зробити гаком у наступному випуску основної версії.


1
У мене був такий метод, як це працював раніше, але у мене виникло багато проблем, коли я його спробував, тому що коли користувач перемикає теми, він не видалить файл шаблону, а якщо вони скопіюють свою активну тему і перенесуть її на інший сайт , вони ризикують завантажити власний файл шаблону, який би не працював. Я знаю, що для цього є декілька способів вирішення, але я дуже хочу, щоб це було автоматичним . Хоча +1 за пропозицію.
Джаред

1
Привіт Джареде, мене також хвилювало те саме питання. Єдиним рішенням, на який я міг би поширити цей альтернативний метод, було б плагін після його активації отримати назву поточної теми, тоді якщо користувач деактивує / переключить теми, ви можете видалити файл шаблону з цієї теми та переписати його на щойно активований тема. Перегляньте це посилання, де він створив власні гачки активації / деактивації для перевірки тем. Маючи трохи додаткового коду, я вважаю, що це можливо.
Адам

Абсолютно, я думаю, що це може спрацювати. Я підкажу і опублікую результати свого запитання. Дякуємо за посилання, це допомагає!
Джаред

1

Я переглянув джерело, і дуже шокуюче, схоже, немає способу зробити це! Моїм запропонованим хаком було б додати друге мета-вікно із розкриттям теми / випадання другої теми. Потім підключіть до цього фільтра:

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

щоб повернути файл теми, якщо його відмінено. Звичайно, ви хочете лише додати_фільтр, якщо це посада, яку ви хочете.

Якщо ви хочете пофантазувати, ви можете зірвати оригінальну скриньку і заново створити її (через фільтри, звичайно, не змінюючи основний код).

Я б також запропонував додати квиток на трак, що вимагає цієї функціональності (якщо його ще немає в ньому).


1
погодитися з / пропонуючи це для trac.
helgatheviking

Здається, це вже є в trac: core.trac.wordpress.org/ticket/15803
Джаред

1
Я щойно досліджував це ще одним питанням щодо шаблонів одного типу публікацій . Квитки на Trac можна знайти в кінці відповіді. Будемо сподіватися на 3.4.
кайзер

1

Я це робив у минулому, видаливши метабокс шаблонів сторінки за замовчуванням, а потім додавши власне метаполе. У мене новий метабокс використовував вбудовані в get_page_templates, а потім додав інші, які мені потрібні програмно. Заощадження може оновити шаблон сторінки так само, як це робить WordPress.


Ви б не хотіли показати повний код? В даний час це лише груба концепція. Дякую.
кайзер

1

Перевірте гачок theme_page_templates, використаний get_page_templatesфункцією, додано фільтр з 3.9, оновлений у 4.4:

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


-2

Результат пошуку за допомогою DuckDuckGo додати шаблон сторінки WordPress, який знайшов для мене відповідь на сторінці wpmu.org під назвою " Навчальний шаблон шаблону сторінки WordPress" .

По суті, всередині каталогу тем, wp-content / themes / your-topic , скопіюйте існуючий шаблон сторінки на нове ім'я файлу php, яке ви обрали. Відредагуйте новий файл, подбаючи про те, щоб змінити магічне значення властивості "Ім'я шаблону:" у коментарі у верхній частині файлу.

Це було все, що було там. Можливо, це особливість, яка поставила питання після дати. Я використовую WP 3.5 з темою двадцять одиннадцять.

Можливо також, що є більш чіткі способи поширити тему. Такі зміни можуть бути замінені оновленнями тем. Меа Кульпа.


Мені потрібно рішення, щоб додати шаблон до випадаючого списку із плагіна, а не теми. :(
Джаред
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.