在写插件模板 - 儿童插件概念

时间:2015-09-16 11:11:59

标签: wordpress wordpress-plugin woocommerce woothemes

是否可以通过在主题文件中创建文件夹来覆盖插件模板,并将文件复制到该文件夹​​中并更改内容[文件夹和文件名都与插件中的名称相同]。

一般来说,我们通过遵循这些系统来改变woocommerce页面模板.Whehemes已经为他们的woocommerce插件实现了类似的东西。您将文件从 / wp-content / plugins / woocommerce < - >复制到< - > / wp -content / themes / yourthemes / woocommerce 和WP自动使用主题文件夹中的文件而不是插件文件夹。通过这种方式,用户可以对其插件进行自定义,而不会将其丢失为插件更新。这是否适用于所有插件?

如果不是,使用woocommerce插件根据我们的主题文件夹woocoomerce文件夹中的文件更改样式的代码是什么?

CHILD PLUGIN 概念怎么样?

  

有什么可能吗?

1 个答案:

答案 0 :(得分:6)

Woocommerce首先检查文件/wp-content/themes/yourthemes/woocommerce是否存在并要求它。如果不是,则需要/wp-content/plugins/woocommerce

中的常规模板

插件中的简单可能解决方案,您可以使用。

function loadTemplate( $template_name ){
    $plugin_path = plugin_dir_path(__FILE__);
    $original_template = $plugin_path . "templates/" . $template_name . ".php";

    $theme_path = get_template_directory();
    $override_template = $theme_path . "/myplugin/" . $template_name . ".php";

    if(file_exists($override_template)){
         include( $override_template );
    }
    else{
         include( $original_template );
    }
}

现在你可以像你想要的那样使用loadTemplate()函数:

function load_teplate_after_content( $template_name ) {
    loadTemplate( 'example' );
    // Now it will check first for
    // wp-content/themes/yourtheme/myplugin/example.php 
    // and load, if not exists it will load original template from
    // /wp-content/plugins/myplugin/templates/example.php
}
add_filter( 'the_content', 'load_teplate_after_content' );

当然记得要为你的函数加上前缀或把它放在一个类中。这只是一个简单的例子。

未经测试。可能有些错误。

编辑:

回答所有问题。这正是woocommerce如何做到这一点

/**
 * Get template part (for templates like the shop-loop).
 *
 * @access public
 * @param mixed $slug
 * @param string $name (default: '')
 * @return void
 */
function wc_get_template_part( $slug, $name = '' ) {
    $template = '';

    // Look in yourtheme/slug-name.php and yourtheme/woocommerce/slug-name.php
    if ( $name && ! WC_TEMPLATE_DEBUG_MODE ) {
        $template = locate_template( array( "{$slug}-{$name}.php", WC()->template_path() . "{$slug}-{$name}.php" ) );
    }

    // Get default slug-name.php
    if ( ! $template && $name && file_exists( WC()->plugin_path() . "/templates/{$slug}-{$name}.php" ) ) {
        $template = WC()->plugin_path() . "/templates/{$slug}-{$name}.php";
    }

    // If template file doesn't exist, look in yourtheme/slug.php and yourtheme/woocommerce/slug.php
    if ( ! $template && ! WC_TEMPLATE_DEBUG_MODE ) {
        $template = locate_template( array( "{$slug}.php", WC()->template_path() . "{$slug}.php" ) );
    }

    // Allow 3rd party plugin filter template file from their plugin
    if ( ( ! $template && WC_TEMPLATE_DEBUG_MODE ) || $template ) {
        $template = apply_filters( 'wc_get_template_part', $template, $slug, $name );
    }

    if ( $template ) {
        load_template( $template, false );
    }
}

EDIT2:

  

这是否适用于所有插件

所有具有此功能的插件都可以实现。

  

或者CHILD PLUGIN概念怎么样?

没有一般答案。如果插件为其功能提供API,则可以创建此类子插件。但直接取决于当前的插件代码是个坏主意。当您的parent plugin(1)发生变化时,如果您使用已删除或编辑的功能,您的插件将会中断。

但正如我所说,如果插件提供一致的API,并且它足以编写这样的功能,那么是的。但不适用于所有插件。至少没有编辑插件本身。

(1)没有像child pluginparent plugin这样的东西。