如何显示(插件?)在单个页面上输出(不是小工具,可能也不是短代码)-模板、插件、组合?

时间:2019-03-26 作者:vaxhax

我已经看到了这个问题的许多变体,但我找到的答案都没有回答我的问题。不是PHP新手,而是WP新手,是的,我读了很多文档。所以这就是我潜入WP开发的地方,请温柔一点。

此问题是关于显示以下内容的最佳方式:

客户端需要一个自定义用户页面,该页面将显示来自外部API结果和内部WP内容的数据组合(将使用自定义字段键入该结果)。

对于这个视图(客户称之为仪表板,但由于WP术语,我不太愿意使用),我是否应该创建一个自定义模板并在其中完成所有工作?我应该在插件和自定义页面模板的组合中这样做吗?

似乎大多数与我所做的最接近的答案最终都指向了小部件的方向。这需要是一个完整的页面视图,显示登录用户根据外部CMS API的查询拥有的事件和其他相关资产的列表(所有这些资产都将是WP CPT)。

我很想在自定义页面模板中完成这一切,但感觉它有足够的可重用逻辑,应该打包在插件中。它不会是普通帖子的一部分,所以使用短代码似乎不太可能。

使用自定义模板保存代码并完成工作是否是一种非常糟糕的做法?所有这些数据和工时将仅显示在这一个视图上。如果逻辑包含在插件中,那么告诉插件将其输出转储到给定页面且仅在该页面上的最快方式是什么?

我在手机上工作,所以我可以根据需要编辑和澄清,但一些指导甚至对特定的文档都会很有帮助。关于如何执行api调用的教程太多,关于在哪里最好地运行该调用以及如何指定输出位置的教程(对我来说)不够。我不需要在每一个页脚中都有什么东西,也不需要侧边栏中的小部件。如果这是一个直接的php项目,它将是一个单一的文件,但我想为WP做正确的事情。

非常感谢。

1 个回复
最合适的回答,由SO网友:leymannx 整理而成

在其他常见的PHP框架中,通常会传播一条新路由,并使用一个控制器作为回调来打印所需的输出。在WordPress中,目前似乎还没有内置这样的功能。

但我建议您以某种方式模仿这种方法。

自定义插件中有一条规则,即当调用某个自定义URL时,将使用某个自定义模板呈现主要内容

  • 在某个自定义模板中,从第一步开始调用该函数

    <?php
    /*
    Plugin Name: My Plugin
    Description: Lorem ipsum dolor sit amet.
    Version: 1.0
    Author: You
    Author URI: https://example.com
    */
    
    class MyPlugin {
    
      public function __construct() {
    
        add_action(\'template_include\', [$this, \'template_suggestion\'];
      }
    
      function template_suggestion($template) {
    
        global $wp;
    
        $current_slug = $wp->request;
    
        $custom_template = locate_template([\'foobar.php\']);
    
        if ($current_slug == \'lorem-ipsum\' && $custom_template != \'\') {
    
          status_header(200);
          return $custom_template;
        }
    
        return $template;
      }
    
      public static function Foo() {
    
        // Do whatever you need to do to build your markup.
        $output = \'<div>\';
        $output .= \'Foo\';
        $output .= \'</div>\';
    
        return $output;
      }
    
      public static function Bar() {
    
        // Do whatever you need to do to build your markup.
        $output = \'<div>\';
        $output .= \'Bar\';
        $output .= \'</div>\';
    
        return $output;
      }
    
    }
    
    new MyPlugin();
    
    然后在里面foobar.php 简单地说:

    <div>
      <?php echo MyPlugin::Foo();?>
      <?php echo MyPlugin::Bar();?>
    </div>