使用插件替换主WP循环

时间:2018-03-20 16:08:01

标签: wordpress custom-wordpress-pages

我想用其他文件中的代码替换主WP循环,例如:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <?php get_template_part( 'tpl/content', 'single' ); ?>
<?php endwhile;
    endif;?>  

像Woocommerce中的东西 - 我想要替换网站的“内容”,网站的页眉和页脚应该看起来像一个主题。 我曾尝试使用“template_include”和“single_template”,但这些方法正在取代整个页面。

我的主要目标是使用我的插件替换“内容”,无论WP使用什么主题。

1 个答案:

答案 0 :(得分:1)

  

我的主要目标是使用我的插件替换“内容”,无论WP使用什么主题。

如果你想改变wordpress页面的“内容”,你应该考虑

  1. 编写函数并将该函数添加到内容过滤器the_content
  2. 创建一个短代码,让用户选择在哪个页面上呈现插件的内容。
    • 您还可以创建一个挂钩到register_activation_hook的函数,该函数会创建一个新页面,并将插件的短代码预先加载到其中。我很确定这就是WooCommerce所做的。
  3. 编写函数并将该函数添加到内容过滤器the_content

    <?php
    // one/of/your/plugin/files.php
    
    function marcin_plugin_content($content) {
        /**
         * Some check to establish that the request is for
         * a page that your plugin is responsible for altering.
         */
        if (true === is_page('marcin_plugin_page')) {
            $new_content = 'whatever it is you do to create your plugin\'s content, do it here!';
            return $new_content;
        }
    
        // we don't want to alter content on regular posts/pages
        return $content;
    }
    
    add_filter('the_content', 'marcin_plugin_content');
    

    https://codex.wordpress.org/Plugin_API/Filter_Reference/the_content

    创建一个短代码,让用户选择在哪个页面上呈现插件的内容。

    <?php
    // one/of/your/plugin/files.php
    
    function marcin_plugin_shortcode($atts)
    {
        // Borrowed from https://codex.wordpress.org/Shortcode_API
        $a = shortcode_atts(
            [
             'foo' => 'something',
             'bar' => 'something else',
            ],
            $atts
        );
    
        // Do whatever you do here to generate your plugin's output...
        $output = 'Foo: "'.$a['foo'].'", Bar: "'.$a['bar'].'"';
    
        return $output;
    }
    
    add_shortcode('marcin', 'marcin_plugin_shortcode');
    

    然后,您的用户将负责将[marcin]短代码放入页面或帖子中以呈现插件的“内容”。

    如果您想自动为用户创建页面,可以尝试:

    <?php
    // path/to/your/plugin/files.php
    
    function marcin_on_activate() {
        // Maybe do a check that this doesn't exist already to avoid duplicates.. this is just an example!!
        $data = [
            'post_title'    => 'Plugin Page',
            'post_content'  => '[]',
            'post_status'   => 'publish',
        ];
    
        // Insert the post into the database.
        wp_insert_post($data);
    }
    
    register_activation_hook(__FILE__, 'marcin_on_activate');
    

    如果您还没有,我建议您阅读WP codex的Plugin API页面!此外,您知道在哪里可以挂钩或过滤:

    还有一些参考文献:

    修改:OP写道:

      

    我的不好:“内容” - 我指的是我的CPT的所有字段:例如:标题,描述,作者,创建日期,价格......房间数量等等。

    在这种情况下,您需要执行模板覆盖,然后do as WooCommerce does,并在模板中包含对get_header()get_footer()的调用。那些功能

      

    在您当前主题的目录中包含... [页眉/页脚] .php模板文件