【问题标题】:How can I add a PHP page to WordPress?如何将 PHP 页面添加到 WordPress?
【发布时间】:2011-02-18 02:27:20
【问题描述】:

我想为我的 WordPress 博客创建一个自定义页面,该页面将在其中执行我的 PHP 代码,同时保留整个网站 CSS/主题/设计的一部分。

PHP 代码将使用第三方 API(因此我需要包含其他 PHP 文件)。

我该如何做到这一点?

注意:我没有与 WordPress API 交互的特定需求 - 除了包含某些其他 PHP 库之外,我需要在我想要包含在 WordPress 页面中的 PHP 代码中没有其他依赖项。所以很明显,任何不需要学习 WordPress API 的解决方案都是最好的。

【问题讨论】:

标签: php wordpress


【解决方案1】:

您无需与 API 交互或使用插件。

首先,在您的主题文件夹中复制post.phppage.php(在/wp-content/themes/themename/ 下)。

将新文件重命名为 templatename.php(其中 templatename 是您要调用的新模板)。要将新模板添加到可用模板列表中,请在新文件顶部输入以下内容:

<?php
/*
Template Name: Name of Template
*/
?>

您可以修改此文件(使用 PHP)以包含其他文件或任何您需要的文件。

然后在您的 WordPress 博客中创建一个新页面,在页面编辑屏幕中,您会在右侧的 Attributes 小部件中看到一个 Template 下拉菜单。选择您的新模板并发布页面。

您的新页面将使用templatename.php 中定义的 PHP 代码

来源:Creating Custom Page Templates for Global Use

【讨论】:

  • 模板选项在我创建包含注释的文件之前不可用。然后出现了模板选项。很好 - 我打算使用简码,但这更容易。
  • 使用插件发布php有什么坏处吗?
  • 一个页面就是一个页​​面,当浏览器查看它是一个 http 请求 - 所以是的。
  • @DamianGreen 这个问题并没有要求完全自动化的方式,实际上表明了避免使用 WP API 的偏好
  • 这个答案感觉不对,因为它不是重新使用现有的主题元素,而是复制粘贴它们(第 2 段)。如果主题由第三方提供,那么它可能会收到不会级联到自定义模板的主题更新。此外,它增加了更改网站外观和感觉的复杂性,更改主题需要重建自定义页面。由于这两个原因,插件会不会更好?我阅读问题的方式是,OP 希望添加额外的功能,而不是额外的主题元素 “使用 3rd 方 API”
【解决方案2】:

如果您想创建自己的 .php 文件并在没有 404 标头的情况下与 WordPress 交互并保持当前的永久链接结构,则不需要为该页面提供模板文件。

我发现这种方法在您的 .php 文件中效果最好:

<?php
    require_once(dirname(__FILE__) . '/wp-config.php');
    $wp->init();
    $wp->parse_request();
    $wp->query_posts();
    $wp->register_globals();
    $wp->send_headers();

    // Your WordPress functions here...
    echo site_url();
?>

然后您可以在此之后简单地执行任何 WordPress 功能。此外,这假定您的 .php 文件位于您的 wp-config.php 文件所在的 WordPress 站点的根目录中。

对我来说,这是一个无价的发现,因为我使用 require_once(dirname(__FILE__) . '/wp-blog-header.php'); 的时间最长,因为 WordPress 甚至告诉你这是你应该用来集成 WordPress 功能的方法,除了,它会导致 404 标头,这很奇怪,他们希望您使用这种方法。 Integrating WordPress with Your Website

我知道很多人已经回答了这个问题,并且它已经有了一个公认的答案,但是对于 WordPress 站点根目录中的 .php 文件(或者从技术上讲,在您的站点中的任何位置),这是一个很好的方法,即您可以浏览并加载没有 404 标头!


更新:有一种方法可以在没有 404 标头的情况下使用 wp-blog-header.php,但这需要您手动添加标头。像这样的东西将在您的 WordPress 安装的根目录中工作:
<?php
    require_once(dirname(__FILE__) . '/wp-blog-header.php');
    header("HTTP/1.1 200 OK");
    header("Status: 200 All rosy");

    // Your WordPress functions here...
    echo site_url();
?>

只是为了让大家了解这一点,这种方法需要的代码少一点,但这取决于你使用哪一个。

【讨论】:

  • 然而 404 标头出现了,甚至 wp-activate.php 中的 Wordpress 多站点文件也必须在使用此页面顶部的 require( dirname( __FILE__ ) . '/wp-blog-header.php' ); 激活新的多站点时通过设置 $wp_query-&gt;is_404 = false 来禁用 404 标头。
  • 我不明白你怎么不能重现这个问题。重新创建非常简单。只需安装 Wordpress,然后创建一个 .php 文件,使用 wp-blog-header.php 定义的 codex.wordpress.org/Integrating_WordPress_with_Your_Website 方法,而不是在浏览器检查器工具中查看 404 标头。
  • 这里有一个网页也记录了这个问题,以防你在深入研究这个问题时错过了它:cooltrainer.org/…
  • 标题问题是在最新版本的 WordPress 中发生的问题,这正是我在最初评论中所建议的。小心使用“永不失败”之类的词。 :)
  • 这是一个非常不恰当的解决问题的方法。通过这条路线,您正在创建一个仅在 WP 不更改其引导程序时才有效的解决方案。您应该利用可用的钩子来(轻松地)完成它正在尝试做的事情。
【解决方案3】:

如果您像我一样,有时您希望能够在 CMS 中不存在的页面中引用 WordPress 函数。这样,它保持特定于后端,不会被客户端意外删除。

这实际上很简单,只需使用 PHP require() 包含 wp-blog-header.php 文件即可。

这是一个使用查询字符串为任何帖子生成 Facebook Open Graph (OG) 数据的示例。

http://example.com/yourfilename.php?1 之类的链接为例,其中1 是我们要为其生成OG 数据的帖子的ID:

现在在yourfilename.php 的内容中,为方便起见,它位于 WordPress 根目录中:

<?php
    require( dirname( __FILE__ ) . '/wp-blog-header.php' );

    $uri = $_SERVER['REQUEST_URI'];
    $pieces = explode("?", $uri);
    $post_id = intval( $pieces[1] );

    // og:title
    $title = get_the_title($post_id);

    // og:description
    $post = get_post($post_id);
    $descr = $post->post_excerpt;

    // og:image
    $img_data_array = get_attached_media('image', $post_id);
    $img_src = null;
    $img_count = 0;

    foreach ( $img_data_array as $img_data ) {
        if ( $img_count > 0 ) {
            break;
        } else {
            ++$img_count;
            $img_src = $img_data->guid;
        }
    } // end og:image

?>
<!DOCTYPE HTML>
<html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=yes" />
<meta property="og:title" content="<?php echo $title; ?>" />
<meta property="og:description" content="<?php echo $descr; ?>" />
<meta property="og:locale" content="en_US" />
<meta property="og:type" content="website" />
<meta property="og:url" content="<?php echo site_url().'/your_redirect_path'.$post_id; ?>" />
<meta property="og:image" content="<?php echo $img_src; ?>" />
<meta property="og:site_name" content="Your Title" />
</html>

你有它:使用帖子的实际图像、摘录和标题为任何帖子生成共享模型!

我们本可以创建一个特殊的模板并编辑永久链接结构来执行此操作,但由于它只需要一个页面,而且我们不希望客户端从 CMS 中删除它,这似乎是更简洁的选项.


2017 年编辑: 请注意,此方法现已弃用

对于 2016 年以上的 WordPress 安装,请参阅 How can I add a PHP page to WordPress? 了解在将页面数据输出到浏览器之前要包含的额外参数。

【讨论】:

    【解决方案4】:

    创建模板页面是正确的答案。为此,只需将其添加到您在主题文件夹中创建的页面中:

    <?php
        /*
        Template Name: mytemplate
        */
    ?>
    

    为了运行这段代码,你需要从后端选择“mytemplate”作为页面的模板。

    请查看此链接以获取正确的详细信息https://developer.wordpress.org/themes/template-files-section/page-template-files/

    【讨论】:

      【解决方案5】:

      如果您需要在 WordPress 主题之外添加 PHP 页面,任何答案都没有涵盖。就是这样。

      您需要包含 wp-load.php。

      <?php require_once('wp-load.php'); ?>
      

      然后您可以在该页面上使用任何 WordPress 功能。

      【讨论】:

      • 这个想法对我很有用。但是,请查看 this post 关于正确使用 require_once('wp-load.php'); 的信息
      【解决方案6】:

      您需要了解一下 WordPress 的插件 API。

      这解释了如何“挂钩”和“过滤”到 WordPress 机制的不同部分,因此您可以在任何给定时间几乎任何地方执行自定义 PHP 代码。这种挂钩、过滤和自定义代码创作都可以在您的任何主题的 functions.php 文件中进行。快乐编码:)

      【讨论】:

      • 我真的不想与 Wordpress API 本身交互 - 我的 PHP 代码完全独立于任何 WP 恶作剧。但我确实需要引用外部 php 文件。你确定这个 API 是我需要学习的吗?
      • 这完全取决于你想要做什么。在某些情况下使用 API 会有所帮助,而在其他情况下则完全没有必要。这完全取决于您要达到的目标。您可以接受@adam 的建议并使用页面模板,或者您可以将所有自定义代码保存在一个篮子中,然后挂钩/过滤到 WordPress 的不同部分。我会说所有和所有,选择最适合你的和你觉得舒服的。所有这三个答案都将以一种或另一种形式完成您想要的。
      【解决方案7】:

      您可以在活动主题文件夹下添加任何 php 文件,例如 (/wp-content/themes/your_active_theme/) 然后您可以从 wp-admin 添加新页面并从页面中选择此页面模板 模板选项。

      <?php
      /*
       Template Name: Your Template Name
       */
      ?>
      

      还有另一种方法可以将文件包含在 functions.php 并从中创建短代码,然后你可以把它 像这样在您的页面中添加短代码。

      // CODE in functions.php 
      
      function abc(){
       include_once('your_file_name.php');
      }
      add_shortcode('abc' , 'abc');
      

      然后你可以像这样在 wp-admin 侧页中使用这个简码 [abc]

      【讨论】:

        【解决方案8】:

        将 WordPress 中的 PHP 页面添加到 themechild-theme 文件夹中的 Page Template 的最佳方式。

        如何在 WordPress 中创建Page Template

        创建一个名为template-custom.php 的文件并将其放入/wp-content/theme/my-theme/

        <?php
         /*
         * Template Name: Custom Template
         * Custom template used for custom php code display
         * @package   Portafolio WordPress Theme
         * @author    Gufran Hasan
         * @copyright Copyright templatecustom.com
         * @link      http://www.templatecustom.com
         */
        ?>
        <?php get_header(); ?>
        <?php
          //write code here
        
         ?>
        
        <?php get_footer(); ?>
        

        For more details

        【讨论】:

          【解决方案9】:

          创建一个名为 my-page.php 的页面并将其保存在您的主题目录下。 现在,编辑这个 php 文件并在页面顶部写入以下行

          <?php /* Template Name: My Page */ ?>
          

          在自定义页面定义行下编写你的PHP代码,你可以调用你的其他WP模板,这个文件里面的函数。

          开始喜欢 &lt;?php require_once("header.php");?&gt;

          无论您以何种方式集成页眉和页脚以保持布局一致。

          由于这是我的页面,您需要从 WordPress 管理面板创建一个页面。 转到管理 => 页面 => 添加新的

          添加页面标题,根据您对自定义页面的编码方式,您也可以添加页面正文(描述)。如果是在自定义 php 页面中编写的,您可以完全跳过描述。

          在右侧,选择模板。 从下拉列表中选择我的自定义页面。 你都准备好了!转到 [wordpress][1] 创建的 slug(永久链接)并查看页面。

          【讨论】:

            【解决方案10】:

            如果您不想处理 WordPress API,那么 Adam 的答案确实是最好的。

            如果您愿意处理 API,我建议您使用“模板重定向”挂钩,这将允许您将特定 URL 或页面指向任意 PHP 文件,同时仍然可以访问 WordPress。

            【讨论】:

              【解决方案11】:

              广为接受的answer by Adam Hopkinson 并不是一种完全自动化的创建页面的方法!它需要用户在 WordPress 的后端(在 wp-admin dash 中)手动创建一个页面。问题是,一个好的插件应该有一个完全自动化的设置。它不应该要求客户端手动创建页面。

              此外,这里其他一些被广泛接受的答案涉及在 WordPress 之外创建一个静态页面,然后只包含一些 WordPress 功能来实现主题页眉和页脚。虽然该方法在某些情况下可能有效,但如果不包含 WordPress 的所有功能,这会使这些页面与 WordPress 的集成变得非常困难。

              我认为最好的、完全自动化的方法是使用wp_insert_post 创建一个页面并将其驻留在数据库中。一个例子和一个很好的讨论,以及如何防止用户意外删除页面,可以在这里找到:wordpress-automatically-creating-page

              坦率地说,我很惊讶这种方法还没有被提及作为这个热门问题的答案(它已经发布了 7 年)。

              【讨论】:

              • 在我写完上述答案后,我立即意识到用户的意图是能够在页面内容中包含 PHP,这种方法显然不允许这样做; PHP只能用于生成内容,不能包含在内容中,因此页面将被静态保存而不是动态保存。但是,您可以通过在每次调用页面时重新创建页面及其内容(通过提供页面 ID)来赋予页面动态外观。您的插件将处理这种情况发生的时间和方式,可能是通过监控 $_SERVER["REQUEST_URI"]
              • 在您的回答中,您谈到了防止用户意外删除。你是怎么做到的?
              【解决方案12】:

              只需在当前主题的文件夹中创建一个page-mytitle.php 文件,然后从仪表板中创建一个页面“mytitle”

              然后,当您通过 URL 调用页面时,您将看到 page-mytitle.php。您必须将 HTML、CSS、JavaScript、wp-loop 等添加到此 PHP 文件 (page-mytitle.php)。

              【讨论】:

                【解决方案13】:

                我知道这是一个老问题,但没有人这样提到:
                您也可以在主题目录中创建一个名为page-my-custom-page.php 的文件,并使用my-custom-page slug 发布一个页面。
                也可以使用 wp 函数来显示页面详细信息(例如 the_content() 来显示页面内容)。

                现在您可以使用example.com/my-custom-page 访问该页面。

                我不确定这是否合适,但在 WP 5.7.3 中经过测试和工作

                【讨论】:

                  【解决方案14】:

                  试试这个:

                  /**
                   * The template for displaying demo page
                   *
                   * template name: demo template
                   *
                   */
                  

                  【讨论】:

                    【解决方案15】:

                    除了创建自定义模板文件并将该模板分配给页面(如已接受答案中的示例中)外,还有一种方法可以使用 WordPress 用于加载模板的模板命名约定(模板层次结构)。

                    创建一个新页面并使用该页面的 slug 作为模板文件名(创建一个名为 page-{slug}.php 的模板文件)。 WordPress 会自动加载符合此规则的模板。

                    【讨论】:

                      【解决方案16】:
                      <?php /* Template Name: CustomPageT1 */ ?>
                      
                      <?php get_header(); ?>
                      
                      <div id="primary" class="content-area">
                          <main id="main" class="site-main" role="main">
                              <?php
                              // Start the loop.
                              while ( have_posts() ) : the_post();
                      
                                  // Include the page content template.
                                  get_template_part( 'template-parts/content', 'page' );
                      
                                  // If comments are open or we have at least one comment, load up the comment template.
                                  if ( comments_open() || get_comments_number() ) {
                                      comments_template();
                                  }
                      
                                  // End of the loop.
                              endwhile;
                              ?>
                      
                          </main><!-- .site-main -->
                      
                          <?php get_sidebar( 'content-bottom' ); ?>
                      
                      </div><!-- .content-area -->
                      
                      <?php get_sidebar(); ?>
                      <?php get_footer(); ?>
                      

                      【讨论】:

                        【解决方案17】:

                        您可以将文件命名为“newpage.php” - 将它放在您的主题目录中wp-content。您可以将其设为页面模板(请参阅http://codex.wordpress.org/Pages..。)或者您可以将其包含在主题中的一个 PHP 文件中,例如 header.php 或 single.php。

                        更好的是,创建一个子主题并将其放入其中,这样您就可以不用管主题代码,并且更容易更新。

                        http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates

                        【讨论】:

                        • 链接断了一半:它重定向了两次,并且没有任何名为“创建您自己的页面模板”的子部分。最接近的可能是也可能不是子部分Page Templates”。还有单独的页面(同名)Page Templates
                        【解决方案18】:

                        您也可以直接使用PHP页面,比如创建PHP页面并以全路径运行。

                        喜欢,http://localhost/path/filename.php

                        【讨论】:

                        • 但是翻译功能不起作用,所以由于某种原因无法加载。
                        猜你喜欢
                        • 2016-05-02
                        • 1970-01-01
                        • 2014-03-02
                        • 2017-02-17
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-10-31
                        • 1970-01-01
                        相关资源
                        最近更新 更多