pammel/simple-wordpress-cms

将 WordPress 作为 CMS 使用,并将生成的页面嵌入现有的 PHP 项目中,例如 Laravel 或 Symfony

v1.1.1 2021-06-21 12:21 UTC

This package is auto-updated.

Last update: 2024-09-21 19:11:42 UTC


README

alt sketch

用例

您有一个现有的 PHP 项目,并希望将 WordPress 作为特定页面的 CMS 使用。您只需要 WordPress 网站的页面内容,因为页眉、页脚、导航等已经在您的网站上存在。

这就是 Simple-Wordpress-CMS 的概念

  • 它从 WordPress 页面获取内容和设计,并将其嵌入到您的 PHP 网站中。
  • 您现有网站的设计不受影响(例如,页眉和页脚)。这是通过使用 Shadow DOM 封装 CSS 来实现的。
  • 链接和 URL 会自动修复。 (SEO)元标签也是如此。除了图像 URL 之外,它们保持不变,因为图像存储在 WordPress 服务器上。
  • 不论 WordPress 安装在何处,它都可以是任何具有不同 URL 的外部服务器。

安装

$ composer require pammel/simple-wordpress-cms

快速入门

使用此代码将 WordPress 页面嵌入到您的 PHP 项目中

<?php

use pammel\SimpleWordpressCms\Config;
use pammel\SimpleWordpressCms\Client;

$config = (new Config())
    ->setWordpressUrl('https://my-wordpress.com')
    ->setProjectUrl('https://my-php-project.com/wp')
    ->setCssFolderLocal('/var/www/my-php-project/public/css')
    ->setCssFolderPublicUrl('/css')
;

$page = (new Client($config))->getPage('my-first-page');  
?>

<html>
  <head>
    <!-- 
      Your existing html-head, which probably already has some head-tags in it. For example:
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    -->
    
    <? echo $page->getHtmlHead() ?>
  </head>
 
  <body>
    <header>
      <!-- Your existing header and navigation -->
    </header>
  
    <?php echo $page->getHtmlBody() ?>

    <footer>
      <!-- Your existing footer -->
    </footer>
  </body>
</html>

功能

更多功能请参阅

缓存

强烈建议缓存页面对象,因为解析 WordPress 页面需要几秒钟。以下是一个使用 Laravel 的示例

<?php

use Illuminate\Support\Facades\Cache;
use pammel\SimpleWordpressCms\Client;
use pammel\SimpleWordpressCms\Config;

$slug = 'my-first-page';

$cacheKey = md5('wordpress:' . $slug);
$page = Cache::remember($cacheKey, 3600, function() use($slug){
    $config = (new Config())
        ->setWordpressUrl('https://my-wordpress.com')
        ->setProjectUrl('https://my-php-project.com/wp')
        ->setCssFolderLocal('/var/www/my-php-project/public/css')
        ->setCssFolderPublicUrl('/css')
    ;

    return (new Client($config))->getPage($slug)->preprocess();
});

故障排除

  • 不要使用依赖于 JavaScript 的 WordPress 主题,特别是用于渲染的。
  • 我推荐使用轻量级主题,例如 https://generatepress.com。它不使用 JavaScript,并且不会与短代码产生问题。
  • 如果您的页面中没有解码的 "短代码",例如 [vc_column_text]Hello World[/vc_column_text],则必须编辑 WordPress 主题的 function.php 文件,并在文件末尾添加类似以下内容
# wp-content\themes\<your-theme>\function.php
 
 ...
 
/**
 * Modify REST API content for pages to force
 * shortcodes to render since Visual Composer does not
 * do this
 */
add_action( 'rest_api_init', function ()
{
    register_rest_field(
       'page',
       'content',
       array(
          'get_callback'    => 'compasshb_do_shortcodes',
          'update_callback' => null,
          'schema'          => null,
       )
    );
});

function compasshb_do_shortcodes( $object, $field_name, $request )
{
    WPBMap::addAllMappedShortcodes(); // This does all the work

    global $post;
    $post = get_post ($object['id']);
    $output['rendered'] = apply_filters( 'the_content', $post->post_content );

    // EDIT: add custom CSS to $output:
    $output[ 'yb_wpb_post_custom_css' ] = get_post_meta( $object[ 'id' ], '_wpb_post_custom_css', true);

    return $output;
}