Я не могу ответить на user1912899, но их рекомендация кажется наиболее элегантным решением. Чтобы использовать собственный шаблон для переопределения single-post.php, я реализовал следующий код. Это будет работать для любого индивидуального - ****. Php файла, который вы добавляете в свой плагин. Если он не существует, он просто возвращается к тому, что обычно использует WordPress.

жно ли использовать файл в каталоге плагинов в качестве пользовательского шаблона страницы?

Кроме того, как вы делаете плагин для создания страницы?

Я разрабатываю плагин для клиента на основе темы, он хочет, чтобы этот плагин создавал страницы продаж, при этом используя свою тему на главной странице. Это продукт, который я делаю для него на рынке, поэтому его нужно автоматизировать через плагин.

Это возможно?

РЕДАКТИРОВАТЬ

У меня есть крюки активации / деактивации в главном файле моих плагинов, и этоне работает, Вот код:

$filename = __FILE__;

register_activation_hook($filename, 'superActivation');
register_deactivation_hook($filename, 'superDeactivation');

global $myFile; global $fh; global $stringData; global $filename;

$myFile = "testFile.txt";
$stringData = "Testing\n";
$fh = fopen($myFile, 'w') or die("can't open file");

function superActivation() {
    global $myFile; global $fh; global $stringData; global $filename;
    fwrite($fh, $stringData);
    fclose($fh);
}

function superDeactivation() {
    $myFile = "testFile.txt";
    unlink($myFile);
}
 t31os10 янв. 2011 г., 21:04
Вам нужно проверить, что каталог активной темы доступен для записи, прежде чем вы сможете создать файл там (я думаю). Что касается того, чтобы плагин предоставил шаблон страницы, да, это, безусловно, можно сделать, вам нужно зацепитьtemplate_redirect и отрегулируйте путь к шаблону, который должен быть вызван. В будущем, пожалуйста, рассмотрите возможность размещения своих вопросов в WordPress наwordpress.stackexchange.com

Ответы на вопрос(4)

Решение Вопроса

чтобы вручную заменить шаблон для пользовательского типа сообщения на один в теме, если в папке с шаблоном его нет. Поместите это в ваш файл плагина, а затем поместите папку под вашим плагином с именем themefiles с файлами по умолчанию.

//Template fallback
add_action("template_redirect", 'my_theme_redirect');

function my_theme_redirect() {
    global $wp;
    $plugindir = dirname( __FILE__ );

    //A Specific Custom Post Type
    if ($wp->query_vars["post_type"] == 'product') {
        $templatefilename = 'single-product.php';
        if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
            $return_template = TEMPLATEPATH . '/' . $templatefilename;
        } else {
            $return_template = $plugindir . '/themefiles/' . $templatefilename;
        }
        do_theme_redirect($return_template);

    //A Custom Taxonomy Page
    } elseif ($wp->query_vars["taxonomy"] == 'product_categories') {
        $templatefilename = 'taxonomy-product_categories.php';
        if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
            $return_template = TEMPLATEPATH . '/' . $templatefilename;
        } else {
            $return_template = $plugindir . '/themefiles/' . $templatefilename;
        }
        do_theme_redirect($return_template);

    //A Simple Page
    } elseif ($wp->query_vars["pagename"] == 'somepagename') {
        $templatefilename = 'page-somepagename.php';
        if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
            $return_template = TEMPLATEPATH . '/' . $templatefilename;
        } else {
            $return_template = $plugindir . '/themefiles/' . $templatefilename;
        }
        do_theme_redirect($return_template);
    }
}

function do_theme_redirect($url) {
    global $post, $wp_query;
    if (have_posts()) {
        include($url);
        die();
    } else {
        $wp_query->is_404 = true;
    }
}
 David07 апр. 2014 г., 17:27
Нет, если вы не положитеget_header(); а такжеget_footer(); в файле шаблона.
 Jashwant07 апр. 2014 г., 18:05
Да, это создаст проблему в теме, которая использует «обертки темы» как корни :( Есть идеи о них?
 David08 апр. 2014 г., 18:31
У меня нет хорошего ответа на это. Это именно та проблема, с которой я сталкиваюсь. Thesis, Roots, Headway - все это вызывает огромные проблемы при таком подходе. (Не связывайтесь со мной о разработчиках тем, которые создают нестандартные темы!) Мне нужно было создать собственные обертки для каждой из этих структур тем. Вот пример того, что я сделал с тезисом:soapboxdave.com/2012/04/...
 Jashwant06 апр. 2014 г., 09:24
Но это не будет включать заголовок, нижний колонтитул. Правильно ?
 user191289910 июн. 2014 г., 20:27
Согласно WP Codex, лучше использовать template_include. «Загрузка другого шаблона не является хорошим использованием этого хука действия. Если вы включите другой шаблон и затем используете exit () (или die ()), не будут запускаться последующие хуки template_redirect, которые могут нарушить функциональность сайта. Вместо этого, используйте ловушку фильтра template_include, чтобы вернуть путь к новому шаблону, который вы хотите использовать. Это позволит использовать альтернативный шаблон без вмешательства в процесс загрузки WordPress. "codex.wordpress.org/Plugin_API/Action_Reference/...

МОЖНО очень легко добавлять шаблоны страниц из плагина, манипулируя кешем страниц.

Для настройки просто отредактируйте следующий блок кода в методе __construct;

   $this->templates = array(
       'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
   );

Это предназначено для плагина (файлы шаблонов ищутся в корневой директории плагина). Это может быть изменено при желании - посмотрите мой полный учебникhttp://www.wpexplorer.com/wordpress-page-templates-plugin/ для более подробной информации об этом решении. Эти файлы также имеют точно такой же формат, как если бы они были включены непосредственно в тему.

Полный код;

class PageTemplater {

    /**
     * A Unique Identifier
     */
     protected $plugin_slug;

    /**
     * A reference to an instance of this class.
     */
    private static $instance;

    /**
     * The array of templates that this plugin tracks.
     */
    protected $templates;


    /**
     * Returns an instance of this class. 
     */
    public static function get_instance() {

            if( null == self::$instance ) {
                    self::$instance = new PageTemplater();
            } 

            return self::$instance;

    } 

    /**
     * Initializes the plugin by setting filters and administration functions.
     */
    private function __construct() {

            $this->templates = array();


            // Add a filter to the attributes metabox to inject template into the cache.
            add_filter(
                'page_attributes_dropdown_pages_args',
                 array( $this, 'register_project_templates' ) 
            );


            // Add a filter to the save post to inject out template into the page cache
            add_filter(
                'wp_insert_post_data', 
                array( $this, 'register_project_templates' ) 
            );


            // Add a filter to the template include to determine if the page has our 
            // template assigned and return it's path
            add_filter(
                'template_include', 
                array( $this, 'view_project_template') 
            );


            // Add your templates to this array.
            $this->templates = array(
                    'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
            );

    } 


    /**
     * Adds our template to the pages cache in order to trick WordPress
     * into thinking the template file exists where it doens't really exist.
     *
     */

    public function register_project_templates( $atts ) {

            // Create the key used for the themes cache
            $cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );

            // Retrieve the cache list. 
            // If it doesn't exist, or it's empty prepare an array
            $templates = wp_get_theme()->get_page_templates();
            if ( empty( $templates ) ) {
                    $templates = array();
            } 

            // New cache, therefore remove the old one
            wp_cache_delete( $cache_key , 'themes');

            // Now add our template to the list of templates by merging our templates
            // with the existing templates array from the cache.
            $templates = array_merge( $templates, $this->templates );

            // Add the modified cache to allow WordPress to pick it up for listing
            // available templates
            wp_cache_add( $cache_key, $templates, 'themes', 1800 );

            return $atts;

    } 

    /**
     * Checks if the template is assigned to the page
     */
    public function view_project_template( $template ) {

            global $post;

            if (!isset($this->templates[get_post_meta( 
                $post->ID, '_wp_page_template', true 
            )] ) ) {

                    return $template;

            } 

            $file = plugin_dir_path(__FILE__). get_post_meta( 
                $post->ID, '_wp_page_template', true 
            );

            // Just to be safe, we check if the file exist first
            if( file_exists( $file ) ) {
                    return $file;
            } 
            else { echo $file; }

            return $template;

    } 


} 

add_action( 'plugins_loaded', array( 'PageTemplater', 'get_instance' ) );

Проверьте мой учебник по этому вопросу для получения дополнительной информации.

http://www.wpexplorer.com/wordpress-page-templates-plugin/

Я надеюсь, что это поможет вам в том, что вы хотите сделать :)

 Xtremefaith14 дек. 2016 г., 22:00
К сожалению, это ломается после обновления WP 4.7. Когда я отлаживаюwp_cache_get($cache_key, 'themes'); В концеregister_project_templates() Показывает значение, но не поддерживается во время следующей итерации
 Xtremefaith15 сент. 2014 г., 20:38
Как бы вы расширили это, чтобы возможно передать массив в _construct ()? Как будто это был класс библиотеки, используемый несколькими плагинами. В моей попытке до сих пор я заставляю шаблоны (из массива) появляться в раскрывающемся списке, но каждый раз, когда я сохраняю / публикую значение, очищается :( Есть мысли по этому поводу?
 Harri Bell-Thomas20 сент. 2017 г., 14:49
Учебное пособие обновлено для работы с обновлением 4.7 -wpexplorer.com/wordpress-page-templates-plugin
 Xtremefaith14 дек. 2016 г., 22:19
Кажетсяwp_get_theme()->get_page_templates() больше не использует кеш. Даже когда я уверен, что кеш имеет правильный массив (после некоторых корректировок) раскрывающийся список по-прежнему не отображает ничего, кроме того, что первоначально было получено отget_page_templates() вызов

но их рекомендация кажется наиболее элегантным решением. Чтобы использовать собственный шаблон для переопределения single-post.php, я реализовал следующий код. Это будет работать для любого индивидуального - ****. Php файла, который вы добавляете в свой плагин. Если он не существует, он просто возвращается к тому, что обычно использует WordPress.

add_action('template_include', 'my_template_include');
function my_template_include($template) {

    $file = dirname( __FILE__ ).'/theme/single-'.get_post_type().'.php';
    if(file_exists($file)) {
        $template = $file;
    }

    return $template;

}

размещенный выше, почти работает для меня. но это, кажется, покрывает все посты и страницы для меня. Приведенный ниже код отлично подходит для добавления шаблона к одному типу записи, который создается моим основным файлом плагина.

function get_book_post_type_template($single_template) {
 global $post;

 if ($post->post_type == 'books') {
      $single_template = dirname( __FILE__ ) . '/themefiles/single-books.php';
 }
 return $single_template;
}

add_filter( "single_template", "get_book_post_type_template" ) ;

но мне трудно заставить его работать с пользовательскими шаблонами страниц, которые не имеют post_type или имеют страницу post_type =, например, скажем, пользовательская страница - это страница входа вспомогательного члена, чтобы увидеть мои пользовательские сообщения. в моем случае этот файл называется myaccount.php, и я включил его в подпапку в папке плагинов с именем themefiles.

//Add Page and Post Template Files to Current Theme 
add_action("template_redirect", 'my_account_redirect');

function my_account_redirect() {
    global $wp;

    //Set myAccount Custom Page Template 
    if (isset($wp->query_vars['pagename'] ) == "myaccount") {
        $templatefilename = 'myAccount.php';
        if (file_exists(dirname( __FILE__ ) . '/themefiles/' . $templatefilename)) {
            $return_template = dirname( __FILE__ ) . '/themefiles/' . $templatefilename;
        }
        do_account_redirect($return_template);
    } 
} 

//Finishing setting templates 
function do_account_redirect($url) {
    global $post, $wp_query;

    if (have_posts()) {
        include($url);
        die();
    } else {
        $wp_query->is_404 = true;
    }
}

Когда я делаю приведенный выше код, шаблон myaccount появляется на всех страницах, кроме домашней, что, я считаю, потому что он установлен в блогролл вместо статической страницы

Ваш ответ на вопрос