Cách nhúng một ứng dụng React vào WordPress trên Ubuntu 18.04
WordPress là một hệ thống quản lý nội dung phổ biến, theo W3Techs (Khảo sát Công nghệ Web), chiếm quyền trên 33% các trang web trên Internet . Một lý do khiến nó rất phổ biến là nó dễ dàng cài đặt với tài liệu rõ ràng, dễ hiểu. Ngoài ra, có rất nhiều tài nguyên cộng đồng hỗ trợ các nhà phát triển WordPress. WordPress có thể giải quyết nhiều trường hợp sử dụng bằng một giải pháp ngoại vi rẻ tiền hoặc thậm chí miễn phí. Cuối cùng, WordPress đi kèm với một hệ thống plugin được xác định rõ ràng, cho phép các nhà phát triển viết mã tùy chỉnh để thêm chức năng của riêng họ. Hệ thống plugin này được ghi chép đầy đủ, hoạt động tốt và như bạn sẽ thấy ở phần sau của hướng dẫn này, rất dễ sử dụng.Các nhà phát triển muốn mang lại trải nghiệm phong phú nhất, tương tác nhất có thể sử dụng JavaScript , được hỗ trợ bởi các khung công tác như React . React là một thư viện JavaScript được thiết kế để giúp các nhà phát triển dễ dàng tạo giao diện user động, tương tác vượt xa một trang hoặc biểu mẫu tĩnh điển hình. Được tạo ra bởi Facebook và do đó được duy trì tốt để bảo mật, ổn định và dễ sử dụng, React rất phổ biến vì nó có tài liệu tốt và một hệ sinh thái tài liệu và plugin hướng tới cộng đồng được cài đặt tốt.
Hướng dẫn này sẽ hướng dẫn bạn các phương pháp hay nhất để nhúng ứng dụng React vào trang web WordPress. Đối với ví dụ của nó, nó sẽ sử dụng một trường hợp sử dụng phổ biến: tạo một tiện ích con nhằm mục đích nhúng trên nhiều trang và đôi khi nhiều lần trên một trang. Ở phía server , nó sẽ được triển khai dưới dạng shortcode WordPress . Một shortcode giống như một thẻ HTML, nhưng nó sử dụng dấu ngoặc vuông ( [...]
) thay vì dấu ngoặc nhọn ( <...>
). Thay vì hiển thị trực tiếp một phần tử HTML, nó gọi một hàm PHP, hàm này sẽ hiển thị HTML, được nội suy với dữ liệu từ database .
Đến cuối hướng dẫn này, bạn sẽ tạo shortcode của riêng mình, chèn nó vào một trang trong WP Admin và xuất bản trang đó. Trên trang đó, bạn có thể thấy tiện ích React của bạn được trình duyệt hiển thị.
Yêu cầu
Để làm theo hướng dẫn này, bạn phải có:
- Server Ubuntu 18.04 được cài đặt với hướng dẫn Cài đặt server ban đầu với Ubuntu 18.04 để cấu hình firewall cho server của bạn cùng với user mới có quyền root.
- Tên domain đã đăng ký đầy đủ. Hướng dẫn này sẽ sử dụng
your_domain
làm ví dụ xuyên suốt. Bạn có thể mua domain trên Namecheap , nhận một domain miễn phí trên Freenom hoặc sử dụng công ty đăng ký domain mà bạn chọn. Cả hai bản ghi DNS sau được cài đặt cho server của bạn. Bạn có thể theo dõi phần giới thiệu này về DigitalOcean DNS để biết chi tiết về cách thêm chúng.
- Một bản ghi với
your_domain
trỏ đến địa chỉ IP công cộng của server của bạn. - Một bản ghi A với
www. your_domain
trỏ đến địa chỉ IP công cộng của server của bạn.
- Một bản ghi với
Bản cài đặt Apache, MySQL và PHP trên server của bạn. Bạn có thể lấy điều này theo Cách cài đặt ngăn xếp Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 18.04 .
Apache an toàn với Let's Encrypt theo Cách bảo mật Apache với Let's Encrypt trên Ubuntu 18.04 để tạo certificate SSL miễn phí.
Một bản cài đặt WordPress, bạn có thể nhận được theo Cách cài đặt WordPress với LAMP trên Ubuntu 18.04 và các yêu cầu của nó.
Cài đặt Node.js theo tùy chọn “Cài đặt bằng PPA” trong Cách cài đặt Node.js trên Ubuntu 18.04 . Hướng dẫn này sẽ sử dụng version
11.15.0
, vì vậy khi sử dụngcurl
để download lệnh cài đặt , hãy thay thế10.x
bằng11.x
để làm theo quy trình trong hướng dẫn này.
Bước 1 - Cập nhật và cấu hình quyền đối với hệ thống file
Khi đăng nhập với quyền user không phải root được tạo trong Điều kiện tiên quyết là Cài đặt Server Ban đầu với Ubuntu 18.04 , bạn sẽ không có quyền truy cập để xem hoặc chỉnh sửa các file nào trong folder WordPress. Đây là một vấn đề, vì bạn sẽ thêm và sửa đổi các file sau này để tạo plugin WordPress và ứng dụng React của bạn. Để khắc phục sự cố này, trong bước này, bạn sẽ cập nhật cấu hình WordPress của bạn để bạn có quyền truy cập chỉnh sửa các file WordPress của bạn .
Chạy lệnh sau, thay sammy
cho tên của user không phải root của bạn và /var/www/ wordpress
cho đường dẫn đến folder WordPress của bạn (là folder root của tài liệu Apache bạn đã tạo trong yêu cầu ):
- sudo chown -R sammy:www-data /var/www/wordpress
Hãy chia nhỏ lệnh này:
-
sudo
- Điều này cho phép bạn thực hiện lệnh này nhưroot
, kể từ khi bạn đang chỉnh sửa filesammy
không có quyền truy cập vào. -
chown
- Lệnh này thay đổi quyền sở hữu file . -
-R
- Cờ này thay đổi quyền sở hữu một cách đệ quy, bao gồm tất cả các folder con và file . -
sammy :www-data
- Điều này đặt chủ sở hữu là user không phải root của bạn (sammy
) và giữ group dưới dạngwww-data
để Apache vẫn có thể truy cập các file để phân phát chúng. -
/var/www/ wordpress
- Điều này chỉ định đường dẫn đến folder WordPress của bạn. Đây là folder mà quyền sở hữu sẽ thay đổi.
Để xác minh lệnh này thành công, hãy liệt kê nội dung của folder WordPress:
- ls -la /var/www/wordpress
Bạn sẽ thấy một danh sách các nội dung của folder :
Outputtotal 216 drwxr-x--- 5 sammy www-data 4096 Apr 13 15:42 . drwxr-xr-x 4 root root 4096 Apr 13 15:39 .. -rw-r----- 1 sammy www-data 235 Apr 13 15:54 .htaccess -rw-r----- 1 sammy www-data 420 Nov 30 2017 index.php -rw-r----- 1 sammy www-data 19935 Jan 1 20:37 license.txt -rw-r----- 1 sammy www-data 7425 Jan 9 02:56 readme.html -rw-r----- 1 sammy www-data 6919 Jan 12 06:41 wp-activate.php drwxr-x--- 9 sammy www-data 4096 Mar 13 00:18 wp-admin -rw-r----- 1 sammy www-data 369 Nov 30 2017 wp-blog-header.php -rw-r----- 1 sammy www-data 2283 Jan 21 01:34 wp-comments-post.php -rw-r----- 1 sammy www-data 2898 Jan 8 04:30 wp-config-sample.php -rw-r----- 1 sammy www-data 3214 Apr 13 15:42 wp-config.php drwxr-x--- 6 sammy www-data 4096 Apr 13 15:54 wp-content -rw-r----- 1 sammy www-data 3847 Jan 9 08:37 wp-cron.php drwxr-x--- 19 sammy www-data 12288 Mar 13 00:18 wp-includes -rw-r----- 1 sammy www-data 2502 Jan 16 05:29 wp-links-opml.php -rw-r----- 1 sammy www-data 3306 Nov 30 2017 wp-load.php -rw-r----- 1 sammy www-data 38883 Jan 12 06:41 wp-login.php -rw-r----- 1 sammy www-data 8403 Nov 30 2017 wp-mail.php -rw-r----- 1 sammy www-data 17947 Jan 30 11:01 wp-settings.php -rw-r----- 1 sammy www-data 31085 Jan 16 16:51 wp-signup.php -rw-r----- 1 sammy www-data 4764 Nov 30 2017 wp-trackback.php -rw-r----- 1 sammy www-data 3068 Aug 17 2018 xmlrpc.php
Những file này là những file có trong lõi WordPress trong file có tên là latest.tar.gz
mà bạn đã download từ wordpress.org
trong yêu cầu Cách cài đặt WordPress với LAMP trên Ubuntu 18.04 . Nếu các quyền xuất hiện như trong kết quả trước đó, điều này nghĩa là các file và folder của bạn đã được cập nhật chính xác.
Trong bước này, bạn đã cập nhật cài đặt WordPress của bạn để cấp cho mình quyền truy cập để chỉnh sửa các file của nó. Trong bước tiếp theo, bạn sẽ sử dụng quyền truy cập đó để tạo các file sẽ tạo một plugin WordPress.
Bước 2 - Tạo một plugin WordPress cơ bản
Đến đây bạn có quyền truy cập để sửa đổi các file trong folder WordPress, bạn sẽ tạo một plugin WordPress cơ bản và thêm nó vào cài đặt. Điều này sẽ cho phép React tương tác với WordPress ở phần sau của hướng dẫn.
Một plugin WordPress có thể đơn giản như:
- Thư mục bên trong
wp-content/plugins
. - Một file bên trong folder đó có cùng tên và phần mở rộng file
.php
. - Một comment đặc biệt ở đầu file đó cung cấp cho WordPress metadata plugin quan trọng.
Để tạo một plugin cho mã React mà bạn sẽ viết sau này, hãy bắt đầu bằng cách tạo một folder cho plugin WordPress. Để đơn giản, hướng dẫn này sẽ đặt tên cho plugin là react-wordpress
. Chạy lệnh sau, thay thế wordpress
bằng root tài liệu Apache của bạn:
- mkdir /var/www/wordpress/wp-content/plugins/react-wordpress
Sau đó, chuyển đến folder mới được tạo. Các lệnh tiếp theo sẽ được thực hiện từ đây.
- cd /var/www/wordpress/wp-content/plugins/react-wordpress
Hãy tạo file plugin ngay bây giờ. Hướng dẫn này sẽ sử dụng nano, được gọi bằng lệnh nano
, làm editor dòng lệnh cho tất cả các file . Bạn cũng có thể tự do sử dụng bất kỳ editor nào khác mà bạn chọn, chẳng hạn như Pico , Vim hoặc Emacs .
Mở react-wordpress .php
để chỉnh sửa:
- nano react-wordpress.php
Thêm các dòng sau vào file của bạn để tạo phần bắt đầu của plugin:
<?php /** * @wordpress-plugin * Plugin Name: Embedding React In Wordpress */ defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' );
Phần được comment ở trên cùng cung cấp metadata cho plugin và dòng kiểm tra hằng số ABSPATH
ngăn kẻ xấu truy cập trực tiếp vào tập lệnh này bằng URL của nó. ABSPATH
là đường dẫn tuyệt đối đến folder root WordPress của bạn, vì vậy nếu ABSPATH
được xác định, bạn có thể chắc chắn rằng file đã được tải qua môi trường WordPress.
Lưu ý: Nhiều trường có sẵn cho comment metadata plugin, nhưng chỉ Plugin Name
là bắt buộc. Xem trang Yêu cầu tiêu đề trong tài liệu WordPress để biết thêm chi tiết.
Tiếp theo, mở trình duyệt web và chuyển đến trang Plugins trong domain của bạn ( https:// your_domain /wp-admin/plugins.php
). Bạn sẽ thấy plugin của bạn được liệt kê cùng với các plugin mặc định của WordPress:
Nhấp vào Kích hoạt để bật plugin của bạn.
Khi bạn đã kích hoạt plugin của bạn , hàng chứa plugin của bạn sẽ được đánh dấu bằng màu xanh lam, với đường viền màu xanh lam ở bên trái và thay vì một liên kết bên dưới có nội dung Kích hoạt , sẽ có một liên kết cho biết Hủy kích hoạt :
Tiếp theo, bạn sẽ cài đặt cấu trúc plugin của bạn .
Quay lại terminal của bạn để mở react-wordpress .php
:
- nano react-wordpress.php
Sau đó, cập nhật nó để thêm các dòng được đánh dấu sau, xác định các hằng số hữu ích:
<?php /** * @wordpress-plugin * Plugin Name: Embedding React In Wordpress */ defined( 'ABSPATH' ) or die( 'Direct script access diallowed.' ); define( 'ERW_WIDGET_PATH', plugin_dir_path( __FILE__ ) . '/widget' ); define( 'ERW_ASSET_MANIFEST', ERW_WIDGET_PATH . '/build/asset-manifest.json' ); define( 'ERW_INCLUDES', plugin_dir_path( __FILE__ ) . '/includes' );
Trong các dòng mới được thêm vào, bạn đã xác định ba hằng số:
-
ERW_WIDGET_PATH
- Đây sẽ là đường dẫn đến ứng dụng React. -
ERW_ASSET_MANIFEST
- Đây là đường dẫn đến file kê khai nội dung React, một file chứa danh sách các file JavaScript và CSS cần được đưa vào trang để ứng dụng của bạn hoạt động. -
ERW_INCLUDES
- Thư mục con này sẽ chứa tất cả các file PHP.
Lưu ý mỗi define()
tham plugin_dir_path( __FILE__ )
đến plugin_dir_path( __FILE__ )
. Đó là viết tắt của đường dẫn folder đến file đó.
Sau khi thêm các định nghĩa hằng số, hãy lưu file và thoát khỏi editor .
Lưu ý: Điều quan trọng là không gian tên các hằng số của bạn. Trong trường hợp này, ta đang sử dụng không gian tên ERW_
, viết tắt của Embedding React trong WordPress . Tiền tố biến với không gian tên này đảm bảo chúng là duy nhất để chúng không xung đột với các hằng được xác định trong các plugin khác.
Để tạo folder include includes/
, sẽ chứa các file PHP khác, hãy bắt đầu ở cấp cao nhất của folder plugin, /var/www/ your_domain /wp-content/plugins/ react-wordpress
. Sau đó, tạo folder :
- mkdir includes
Đến đây bạn đã hoàn thiện các file và folder liên quan đến PHP cần thiết để tạo một plugin WordPress, bạn sẽ tạo các file và folder ban đầu cho React.
Bước 3 - Khởi tạo ứng dụng React
Trong bước này, bạn sẽ sử dụng Create React App để khởi tạo ứng dụng React của bạn .
Hướng dẫn này đã được thử nghiệm bằng Tạo ứng dụng React version 3.0.1
. Phiên bản 3.0.0
đã áp dụng các thay đổi đột phá đối với cấu trúc của asset-manifest.json
, do đó, version trước đó không tương thích với hướng dẫn này nếu không có sửa đổi. Để đảm bảo bạn đang sử dụng version mong đợi ở đây, hãy chạy lệnh này để cài đặt Tạo ứng dụng React:
- sudo npm install --global create-react-app@3.0.1
Lệnh này sẽ cài đặt version 3.0.1
của Create React App. Cờ --global
sẽ cài đặt nó trên toàn hệ thống. Việc cài đặt trên toàn hệ thống đảm bảo khi bạn chạy create-react-app
npx create-react-app
create-react-app
(hoặc npx create-react-app
) mà không có bất kỳ đường dẫn nào được chỉ định, bạn sẽ sử dụng version bạn vừa cài đặt.
Sau khi cài đặt Create React App, hãy sử dụng nó để tạo ứng dụng React. Hướng dẫn này sẽ đặt tên cho widget
ứng dụng:
- sudo create-react-app widget
Lệnh này sử dụng npx , là một mã binary đi kèm với NPM . Nó được thiết kế để giúp bạn dễ dàng sử dụng các công cụ CLI và các file thực thi khác được lưu trữ trên NPM. Nó sẽ cài đặt các công cụ đó nếu chúng không được tìm thấy local .
Lệnh create-react-app
sẽ tạo một folder dự án và tất cả các file cần thiết cho một ứng dụng React cơ bản. Điều này bao gồm index.html
, JavaScript khởi động, CSS và file thử nghiệm và package.json
để xác định dự án và các phần phụ thuộc của bạn. Nó bao gồm trước các phụ thuộc và tập lệnh cho phép bạn xây dựng ứng dụng của bạn để production mà không cần cài đặt và cấu hình bất kỳ công cụ xây dựng bổ sung nào.
Khi bạn đã cài đặt ứng dụng widget
, kết quả trong terminal sẽ giống như sau:
Output... Success! Created widget at /var/www/wordpress/wp-content/plugins/react-wordpress/widget Inside that directory, you can run several commands: npm start Starts the development server. npm run build Bundles the app into static files for production. npm test Starts the test runner. npm run eject Removes this tool and copies build dependencies, configuration files and scripts into the app directory. If you do this, you can’t go back! We suggest that you begin by typing: cd widget npm start Happy hacking!
Tiếp theo, chuyển đến folder mới được tạo:
- cd widget
Đến đây bạn sẽ có thể xây dựng ứng dụng của bạn bằng lệnh xây dựng mặc định , npm run build
. Lệnh build
này xem xét file package.json
dưới các scripts
chính cho một tập lệnh có tên là build
:
{ "name": "widget", "version": "0.1.0", "private": true, "dependencies": { "react": "^16.9.0", "react-dom": "^16.9.0", "react-scripts": "3.1.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } }
Điều này gọi file thực thi react-scripts.js
được cung cấp bởi module nút react-scripts
, là một trong những thành phần cốt lõi được cung cấp bởi create-react-app
. Điều này lần lượt gọi là tập lệnh xây dựng, sử dụng webpack để biên dịch các file dự án của bạn thành các file nội dung tĩnh mà trình duyệt của bạn hiểu được. Nó thực hiện điều này bằng cách:
- Giải quyết dependencies .
- Biên soạn Sass file vào CSS và JSX hoặc nguyên cảo vào JavaScript.
- Chuyển đổi cú pháp ES6 thành cú pháp ES5 với khả năng tương thích trên nhiều trình duyệt tốt hơn.
Đến đây bạn đã biết một chút về build
, hãy chạy lệnh trong terminal của bạn:
- sudo npm run build
Khi lệnh hoàn tất, bạn sẽ nhận được kết quả tương tự như sau:
Output> widget@0.1.0 build /var/www/wordpress/wp-content/plugins/react-wordpress/widget > react-scripts build Creating an optimized production build... Compiled successfully. File sizes after gzip: 36.83 KB (+43 B) build/static/js/2.6efc73d3.chunk.js 762 B (+44 B) build/static/js/runtime~main.a8a9905a.js 710 B (+38 B) build/static/js/main.2d1d08c1.chunk.js 539 B (+44 B) build/static/css/main.30ddb8d4.chunk.css The project was built assuming it is hosted at the server root. You can control this with the homepage field in your package.json. For example, add this to build it for GitHub Pages: "homepage" : "http://myname.github.io/myapp", The build folder is ready to be deployed. You may serve it with a static server: npm install -g serve serve -s build Find out more about deployment here: https://bit.ly/CRA-deploy
Dự án của bạn hiện đã được xây dựng, nhưng trước khi chuyển sang bước tiếp theo, cách tốt nhất là đảm bảo ứng dụng của bạn chỉ tải nếu nó có mặt.
React sử dụng một phần tử HTML trong DOM bên trong nó hiển thị ứng dụng. Đây được gọi là phần tử target
. Theo mặc định, phần tử này có root
ID. Để đảm bảo nút root
này là ứng dụng bạn đang tạo, hãy thay đổi src/index.js
để kiểm tra ID của target
cho erw-root
không gian tên. Để làm điều này, đầu tiên hãy mở src/index.js
:
- sudo nano src/index.js
Sửa đổi và thêm các dòng được đánh dấu:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import * as serviceWorker from './serviceWorker'; const target = document.getElementById('erw-root'); if (target) { ReactDOM.render(<App />, target); } serviceWorker.unregister();
Cuối cùng, lưu và thoát khỏi file khi bạn hoàn tất chỉnh sửa.
Trong file này, bạn đã thực hiện hai thay đổi quan trọng đối với index.js
mặc định:
- Bạn đã thay đổi phần tử đích từ
<div id="root"></div>
thành<div id="erw-root"></div>
để nó có không gian tên cho ứng dụng của bạn. - Bạn đã kèm theo lời gọi tới
ReactDOM.render()
trong câu lệnhif (...)
để ứng dụng chỉ được tải nếu nó có mặt.
Lưu ý: Nếu bạn muốn tiện ích hiện diện trên mọi trang, bạn cũng có thể cần thêm một dòng xử lý lỗi, dòng này sẽ in thông báo đến console nếu không tìm thấy phần tử có ID erw-root
. Tuy nhiên, hướng dẫn này sẽ bỏ qua bước này. Một dòng như thế này sẽ tạo ra lỗi console trên mọi trang không có phần tử, kể cả những trang mà bạn không định đưa phần tử vào. Nhiều lỗi console JavaScript này có thể có nguy cơ làm giảm thứ hạng công cụ tìm kiếm cho trang web .
Sau khi thay đổi các file JavaScript hoặc CSS nào trong folder src/
của bạn, điều quan trọng là phải biên dịch lại ứng dụng của bạn để các thay đổi được kết hợp. Để xây dựng lại ứng dụng của bạn, hãy chạy:
- sudo npm run build
Bây giờ folder build/
của bạn chứa một ứng dụng React đang hoạt động ở dạng file JavaScript và CSS. Bước tiếp theo liên quan đến việc cài đặt một số file PHP sẽ xếp hàng JavaScript và CSS của bạn trong trang.
Bước 4 - Xếp hàng các file JavaScript và CSS
Trong bước này, bạn sẽ sử dụng các hành động và bộ lọc WordPress để:
- Xuất mã xếp hàng tập lệnh vào thời điểm thích hợp trong chu kỳ tải trang WordPress.
- Xếp hàng các file JavaScript và CSS của bạn theo cách ít ảnh hưởng nhất đến tốc độ tải trang.
WordPress sử dụng các hành động và bộ lọc làm móc nối chính của nó. Các hành động giúp bạn có thể thực thi mã tại một thời điểm cụ thể trong chu kỳ tải trang và các bộ lọc sửa đổi hành vi cụ thể bằng cách thay đổi giá trị trả về của các hàm mà bạn không sở hữu.
Để sử dụng các hook này, bạn sẽ tạo một file PHP chứa mã phân tích cú pháp file kê khai nội dung. Đây chính là file bạn sẽ sử dụng sau này để xếp hàng tất cả các nội dung để các tập lệnh được ghi vào <head>
.
Trước khi tạo file , hãy sử dụng lệnh sau để chuyển ra khỏi folder chứa ứng dụng React của bạn và vào folder plugin react-wordpress
cấp cao nhất:
- cd /var/www/wordpress/wp-content/plugins/react-wordpress
Tạo file enqueue.php
bên trong folder enqueue.php
includes/
:
- nano includes/enqueue.php
Bắt đầu bằng cách đặt thẻ mở <?php
ở đầu file . Ngoài ra, hãy thêm dòng kiểm tra ABSPATH
, như đã thảo luận trước đây là phương pháp hay nhất trong mọi file PHP:
<?php // This file enqueues scripts and styles defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' );
Lưu và thoát khỏi file này.
Sau đó, cập nhật enqueue.php
react-wordpress.php
để yêu cầu enqueue.php
từ dự án. Đầu tiên, mở file để chỉnh sửa:
- nano react-wordpress.php
Thêm dòng được đánh dấu sau:
<?php /** * @wordpress-plugin * Plugin Name: Embedding React In Wordpress */ defined( 'ABSPATH' ) or die( 'Direct script access diallowed.' ); define( 'ERW_WIDGET_PATH', plugin_dir_path( __FILE__ ) . '/widget' ); define( 'ERW_ASSET_MANIFEST', ERW_WIDGET_PATH . '/build/asset-manifest.json' ); define( 'ERW_INCLUDES', plugin_dir_path( __FILE__ ) . '/includes' ); require_once( ERW_INCLUDES . '/enqueue.php' );
Đây là một mẫu phổ biến trong các plugin WordPress để yêu cầu các file PHP khác từ folder includes/
để chia các việc quan trọng thành nhiều phần. Hàm require_once()
phân tích cú pháp nội dung của file được truyền dưới dạng đối số như thể mã PHP của file đó được viết ngay trong dòng. Không giống như lệnh include
tương tự, lệnh require
sẽ đưa ra một ngoại lệ nếu không tìm thấy file bạn đang cố gắng yêu cầu. Việc sử dụng require_once()
(trái ngược với chỉ enqueue.php
require()
) đảm bảo enqueue.php
sẽ không được phân tích cú pháp nhiều lần nếu chỉ thị require_once( ERW_INCLUDES . '/enqueue.php' );
được đưa ra nhiều lần.
Lưu và thoát khỏi file .
Bây giờ mở lại includes/enqueue.php
:
- nano includes/enqueue.php
Sau đó, thêm mã được đánh dấu sau:
<?php // This file enqueues scripts and styles defined( 'ABSPATH' ) or die( 'Direct script access diallowed.' ); add_action( 'init', function() { add_filter( 'script_loader_tag', function( $tag, $handle ) { if ( ! preg_match( '/^erw-/', $handle ) ) { return $tag; } return str_replace( ' src', ' async defer src', $tag ); }, 10, 2 ); add_action( 'wp_enqueue_scripts', function() { }); });
Thêm một chức năng vào hành động init
nghĩa là mã này sẽ được chạy trong giai đoạn init
của quá trình tải, sau khi chủ đề của bạn và các plugin khác đã tải xong.
Cài đặt async
và defer
thuộc tính trên <script>
thẻ bằng cách sử dụng script_loader_tag
lọc cho trình duyệt để tải các kịch bản không đồng bộ thay vì ngăn chặn xây dựng DOM và render nên trang web.
Các wp_enqueue_scripts
hành động sau đó enqueues mục front-end. Xem trang này để biết thêm chi tiết.
Đảm bảo ghi file và thoát.
Đến đây bạn đã yêu cầu WordPress viết các thẻ script và stylesheet vào trang. Trong bước tiếp theo này, bạn sẽ phân tích cú pháp một file được gọi là file kê khai nội dung. Điều này sẽ cung cấp cho bạn các đường dẫn đến tất cả các file mà bạn cần xếp hàng.
Bước 5 - Phân tích cú pháp file kê khai nội dung
Trong bước này, bạn sẽ phân tích cú pháp file kê khai nội dung được tạo bởi bản dựng React thành danh sách các file JavaScript và CSS.
Khi bạn xây dựng ứng dụng, tập lệnh xây dựng React sẽ xây dựng dự án của bạn thành nhiều file JavaScript và CSS. Số lượng và tên file sẽ thay đổi tùy theo từng bản dựng, vì mỗi bản dựng bao gồm một hàm băm nội dung của file . Tệp kê khai nội dung cung cấp tên của từng file được tạo trong bản dựng mới nhất cùng với đường dẫn đến file đó. Bằng cách phân tích cú pháp theo chương trình, bạn được đảm bảo các thẻ tập lệnh và biểu định kiểu mà bạn ghi vào trang sẽ luôn trỏ đến đúng file , ngay cả khi tên thay đổi.
Trước tiên, hãy kiểm tra asset-manifest.json
bằng lệnh cat
:
- cat widget/build/asset-manifest.json
Nó trông giống như sau :
Output{ "files": { "main.css": "/static/css/main.2cce8147.chunk.css", "main.js": "/static/js/main.a284ff71.chunk.js", "main.js.map": "/static/js/main.a284ff71.chunk.js.map", "runtime~main.js": "/static/js/runtime~main.fa565546.js", "runtime~main.js.map": "/static/js/runtime~main.fa565546.js.map", "static/js/2.9ca06fd6.chunk.js": "/static/js/2.9ca06fd6.chunk.js", "static/js/2.9ca06fd6.chunk.js.map": "/static/js/2.9ca06fd6.chunk.js.map", "index.html": "/index.html", "precache-manifest.e40c3c7a647ca45e36eb20f8e1a654ee.js": "/precache-manifest.e40c3c7a647ca45e36eb20f8e1a654ee.js", "service-worker.js": "/service-worker.js", "static/css/main.2cce8147.chunk.css.map": "/static/css/main.2cce8147.chunk.css.map", "static/media/logo.svg": "/static/media/logo.5d5d9eef.svg" } }
Để phân tích cú pháp, mã của bạn sẽ tìm kiếm các khóa đối tượng kết thúc bằng .js
và .css
.
Mở file enqueue.php
của bạn:
- nano includes/enqueue.php
Thêm đoạn mã được đánh dấu:
<?php // This file enqueues scripts and styles defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' ); add_action( 'init', function() { add_filter( 'script_loader_tag', function( $tag, $handle ) { if ( ! preg_match( '/^erw-/', $handle ) ) { return $tag; } return str_replace( ' src', ' async defer src', $tag ); }, 10, 2 ); add_action( 'wp_enqueue_scripts', function() { $asset_manifest = json_decode( file_get_contents( ERW_ASSET_MANIFEST ), true )['files']; if ( isset( $asset_manifest[ 'main.css' ] ) ) { wp_enqueue_style( 'erw', get_site_url() . $asset_manifest[ 'main.css' ] ); } wp_enqueue_script( 'erw-runtime', get_site_url() . $asset_manifest[ 'runtime~main.js' ], array(), null, true ); wp_enqueue_script( 'erw-main', get_site_url() . $asset_manifest[ 'main.js' ], array('erw-runtime'), null, true ); foreach ( $asset_manifest as $key => $value ) { if ( preg_match( '@static/js/(.*)\.chunk\.js@', $key, $matches ) ) { if ( $matches && is_array( $matches ) && count( $matches ) === 2 ) { $name = "erw-" . preg_replace( '/[^A-Za-z0-9_]/', '-', $matches[1] ); wp_enqueue_script( $name, get_site_url() . $value, array( 'erw-main' ), null, true ); } } if ( preg_match( '@static/css/(.*)\.chunk\.css@', $key, $matches ) ) { if ( $matches && is_array( $matches ) && count( $matches ) == 2 ) { $name = "erw-" . preg_replace( '/[^A-Za-z0-9_]/', '-', $matches[1] ); wp_enqueue_style( $name, get_site_url() . $value, array( 'erw' ), null ); } } } }); });
Khi bạn hoàn tất, hãy ghi và thoát khỏi file .
Đoạn mã được đánh dấu thực hiện như sau:
- Đọc file kê khai nội dung và phân tích cú pháp nó dưới dạng file JSON. Nó truy cập vào nội dung được lưu trữ tại
'files'
và lưu trữ nó vào biến$asset_manifest
. - Xếp hàng đợi file CSS chính nếu nó tồn tại.
- Xếp hàng trước thời gian chạy React, sau đó đến file JavaScript chính, đặt thời gian chạy làm phụ thuộc đảm bảo nó được tải trong trang trước.
- Phân tích cú pháp danh sách file kê khai nội dung cho các file JavaScript nào có tên
static/js/<hash>.chunk.js
và xếp chúng vào hàng sau file chính. - Phân tích cú pháp danh sách file kê khai nội dung cho các file CSS nào có tên
static/css/<hash>.chunk.css
và xếp chúng vào hàng sau file CSS chính.
Lưu ý: Sử dụng wp_enqueue_script()
và wp_enqueue_style
sẽ làm cho các <script>
và <link>
cho các file được xếp hàng xuất hiện trong mọi trang. Đối số cuối cùng true
yêu cầu WordPress đặt file bên dưới chân trang nội dung trang thay vì ở cuối phần tử <head>
. Điều này rất quan trọng để việc tải các file JavaScript không làm chậm phần còn lại của trang.
Trong bước này, bạn đã cô lập các đường dẫn file của các tập lệnh và kiểu được ứng dụng của bạn sử dụng. Trong bước tiếp theo, bạn sẽ đảm bảo các đường dẫn file đó trỏ đến folder build
ứng dụng React của bạn và không có file nguồn nào của bạn có thể truy cập được từ trình duyệt.
Bước 6 - Cung cấp và bảo mật file tĩnh
Đến đây, bạn đã cho WordPress biết những file JavaScript và CSS nào cần tải và tìm chúng ở đâu. Tuy nhiên, nếu bạn truy cập https:// your_domain
trong trình duyệt và nhìn vào console JavaScript, bạn sẽ thấy lỗi HTTP 404. (Xem bài viết này để biết thêm thông tin về cách sử dụng console JavaScript.)
Điều này là do đường dẫn URL đến file (ví dụ: /static/js/main.2d1d08c1.chunk.js
) không trùng với đường dẫn thực tế tới file (ví dụ: /wp-content/plugins/ react-wordpress / widget /build/static/js/main.2d1d08c1.chunk.js
).
Trong bước này, bạn sẽ khắc phục sự cố này bằng cách cho React biết vị trí của folder xây dựng. Bạn cũng sẽ thêm luật ghi lại Apache vào .htaccess
để bảo vệ file nguồn của bạn không bị xem trong trình duyệt.
Để cung cấp cho React đường dẫn chính xác đến ứng dụng của bạn, hãy mở package.json
bên trong folder ứng dụng React của bạn:
- sudo nano widget/package.json
Sau đó, thêm dòng homepage
đánh dấu:
{ "name": "widget", "version": "0.1.0", "private": true, "homepage": "/wp-content/plugins/react-wordpress/widget/build", "dependencies": { "react": "^16.9.0", "react-dom": "^16.9.0", "react-scripts": "3.1.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } }
Viết và thoát khỏi file . Sau đó, xây dựng lại ứng dụng React của bạn. Chuyển đến cấp cao nhất của widget /
:
- cd widget
Sau đó chạy lệnh build
:
- sudo npm run build
Sau khi lệnh xây dựng hoàn tất, hãy kiểm tra file kê khai nội dung bằng cách xuất nội dung của nó vào terminal :
- cat build/asset-manifest.json
Bạn sẽ thấy rằng tất cả các đường dẫn file đã thay đổi:
{ "files": { "main.css": "/wp-content/plugins/react-wordpress/widget/build/static/css/main.2cce8147.chunk.css", "main.js": "/wp-content/plugins/react-wordpress/widget/build/static/js/main.a28d856a.chunk.js", "main.js.map": "/wp-content/plugins/react-wordpress/widget/build/static/js/main.a28d856a.chunk.js.map", "runtime~main.js": "/wp-content/plugins/react-wordpress/widget/build/static/js/runtime~main.2df87c4b.js", "runtime~main.js.map": "/wp-content/plugins/react-wordpress/widget/build/static/js/runtime~main.2df87c4b.js.map", "static/js/2.9ca06fd6.chunk.js": "/wp-content/plugins/react-wordpress/widget/build/static/js/2.9ca06fd6.chunk.js", "static/js/2.9ca06fd6.chunk.js.map": "/wp-content/plugins/react-wordpress/widget/build/static/js/2.9ca06fd6.chunk.js.map", "index.html": "/wp-content/plugins/react-wordpress/widget/build/index.html", "precache-manifest.233e0a9875cf4d2df27d6280d12b780d.js": "/wp-content/plugins/react-wordpress/widget/build/precache-manifest.233e0a9875cf4d2df27d6280d12b780d.js", "service-worker.js": "/wp-content/plugins/react-wordpress/widget/build/service-worker.js", "static/css/main.2cce8147.chunk.css.map": "/wp-content/plugins/react-wordpress/widget/build/static/css/main.2cce8147.chunk.css.map", "static/media/logo.svg": "/wp-content/plugins/react-wordpress/widget/build/static/media/logo.5d5d9eef.svg" } }
Điều này cho ứng dụng của bạn biết nơi để tìm các file chính xác, nhưng cũng đưa ra một vấn đề: Nó làm lộ đường dẫn đến folder src
của ứng dụng và ai đó quen thuộc với create-react-app
có thể truy cập vào https:// your_domain /wp-content/plugins/ react-wordpress / widget /src/index.js
và bắt đầu khám phá các file nguồn cho ứng dụng của bạn. Hãy thử nó cho mình!
Để bảo vệ các đường dẫn mà bạn không muốn user truy cập, hãy thêm luật ghi lại Apache vào .htaccess
của WordPress.
- nano /var/www/wordpress/.htaccess
Thêm bốn dòng được đánh dấu:
<IfModule mod_rewrite.c> RewriteRule ^wp-content/plugins/react-wordpress/widget/(build|public)/(.*) - [L] RewriteRule ^wp-content/plugins/react-wordpress/widget/* totally-bogus-erw.php [L] </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Điều này yêu cầu Apache cho phép trình duyệt yêu cầu bất kỳ thứ gì tại wp-content/plugins/ react-wordpress / widget /build/
hoặc wp-content/ react-wordpress / widget /public/
. Bất kỳ thứ gì khác sẽ chuyển hướng đến totally-bogus-erw.php
. Trừ khi bạn có một file có tên totally-bogus-erw.php
ở cấp cao nhất của bạn , yêu cầu này sẽ được xử lý bởi WordPress, điều này sẽ tạo ra lỗi 404.
Có các plugin WordPress, chẳng hạn như Stream , sẽ theo dõi hoạt động yêu cầu và ghi log 404s. Trong log , yêu cầu sẽ hiển thị địa chỉ IP và trang được yêu cầu khi user nhận được 404. Theo dõi totally-bogus-erw.php
sẽ cho bạn biết liệu một địa chỉ IP cụ thể có đang cố gắng thu thập thông tin folder src
của ứng dụng React của bạn hay không.
Đảm bảo ghi và thoát khỏi file .
Đến đây bạn đã cài đặt định tuyến cần thiết để tải các file JavaScript và CSS của bạn lên trang, đã đến lúc sử dụng mã ngắn để thêm các phần tử HTML vào trang mà JavaScript sẽ tương tác để hiển thị ứng dụng của bạn.
Bước 7 - Tạo mã ngắn
Các mã ngắn giúp bạn có thể chèn các khối HTML phức tạp được nội suy với dữ liệu phía server , với cú pháp trong trang rất đơn giản. Trong bước này, bạn sẽ tạo và đăng ký một shortcode WordPress và sử dụng nó để nhúng ứng dụng của bạn vào trang.
Điều hướng đến cấp cao nhất của plugin của bạn:
- cd /var/www/wordpress/wp-content/plugins/react-wordpress/
Tạo một file PHP mới sẽ chứa shortcode:
- touch includes/shortcode.php
Sau đó, chỉnh sửa file PHP chính của bạn để includes/shortcode.php
được yêu cầu khi plugin của bạn tải. Mở react-wordpress.php
đầu tiên:
- nano react-wordpress.php
Sau đó, thêm dòng được đánh dấu sau:
<?php /** * @wordpress-plugin * Plugin Name: Embedding React In Wordpress */ defined( 'ABSPATH' ) or die( 'Direct script access diallowed.' ); define( 'ERW_WIDGET_PATH', plugin_dir_path( __FILE__ ) . '/widget' ); define( 'ERW_ASSET_MANIFEST', ERW_WIDGET_PATH . '/build/asset-manifest.json' ); define( 'ERW_INCLUDES', plugin_dir_path( __FILE__ ) . '/includes' ); require_once( ERW_INCLUDES . '/enqueue.php' ); require_once( ERW_INCLUDES . '/shortcode.php' );
Viết và thoát khỏi file .
Bây giờ, hãy mở file shortcode mới được tạo:
- nano includes/shortcode.php
Thêm mã sau:
<?php // This file enqueues a shortcode. defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' ); add_shortcode( 'erw_widget', function( $atts ) { $default_atts = array(); $args = shortcode_atts( $default_atts, $atts ); return "<div id='erw-root'></div>"; });
Đoạn mã này chứa hầu hết là bản viết sẵn. Nó đăng ký một shortcode có tên là erw_widget
, khi được gọi ra, sẽ in <div id="erw-root"></div>
, phần tử root của ứng dụng React, vào trang.
Lưu và thoát shortcode.php
.
Để xem ứng dụng React đang hoạt động, bạn cần tạo một trang WordPress mới và thêm shortcode vào đó.
Điều hướng đến https:// your_domain /wp-admin
trong trình duyệt web. Ở đầu trang, bạn sẽ thấy một thanh màu đen có biểu tượng WordPress ở bên trái, tiếp theo là biểu tượng ngôi nhà, tên trang web , biểu tượng bong bóng comment và số, và một liên kết khác có nội dung + Mới . Di chuột qua nút + Mới và menu sẽ thả xuống. Nhấp vào mục menu có nội dung Trang .
Khi màn hình tải, con trỏ của bạn sẽ được đặt tiêu điểm trong hộp văn bản có nội dung Thêm tiêu đề . Nhấp vào đó và bắt đầu nhập để đặt tiêu đề phù hợp cho trang mới. Hướng dẫn này sẽ sử dụng Ứng dụng React của tôi :
Giả sử bạn đang sử dụng trình soạn thảo Gutenberg của WordPress , bạn sẽ thấy một dòng văn bản gần đầu trang, bên dưới tiêu đề, có nội dung Bắt đầu viết hoặc nhập / để chọn khối . Khi bạn di chuột qua văn bản đó, ba biểu tượng sẽ xuất hiện ở bên phải. Chọn cái gần nhất giống với [/]
để thêm khối mã ngắn:
[erw_widget]
mã ngắn [erw_widget]
vào vùng văn bản mới được thêm vào. Sau đó, nhấp vào nút Xuất bản… màu xanh lam ở góc trên bên phải của cửa sổ, rồi nhấn Xuất bản để xác nhận.
Bạn sẽ thấy một thanh màu xanh lục xác nhận trang đã được xuất bản. Nhấp vào liên kết Xem Trang :
Trên màn hình, bạn sẽ thấy ứng dụng của bạn :
Đến đây bạn đã có ứng dụng React cơ bản hiển thị trong trang, bạn có thể tùy chỉnh ứng dụng đó với các tùy chọn do administrator cung cấp phía server .
Bước 8 - Đưa cài đặt do server tạo
Trong bước này, bạn sẽ đưa cài đặt vào ứng dụng bằng cả dữ liệu do server tạo và dữ liệu do user cung cấp. Điều này sẽ cho phép bạn hiển thị dữ liệu động trong ứng dụng của bạn và sử dụng trình nhiều lần trong một trang.
Đầu tiên, hãy mở index.js
:
- sudo nano widget/src/index.js
Sau đó, xóa import App from './App';
và cập nhật nội dung của index.js
với các dòng được đánh dấu sau:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import * as serviceWorker from './serviceWorker'; const App = () => ( <div className="App"> <span className="App__Message">Hello,<br />World!</span> </div> ); const target = document.getElementById('erw-root'); if (target) { ReactDOM.render(<App />, target); } serviceWorker.unregister();
Điều này sửa đổi ứng dụng React của bạn để thay vì trả về màn hình Tạo ứng dụng React mặc định, nó sẽ trả về một phần tử có nội dung Hello, World!
.
Lưu và thoát khỏi file . Sau đó, mở index.css
để chỉnh sửa:
- nano widget/src/index.css
Thay thế nội dung của index.css
bằng đoạn mã sau:
.App { width: 100px; height: 100px; border: 1px solid; display: inline-block; margin-right: 20px; position: relative; } .App .App__Message { font-size: 15px; line-height: 15px; position: absolute; top: 50%; transform: translateY(-50%); text-align: center; width: 100%; }
Các kiểu cho .App
sẽ hiển thị một hình vuông 100 pixel, với đường viền chắc chắn và các kiểu cho .App__Message
sẽ hiển thị văn bản được căn giữa bên trong hình vuông, theo cả chiều dọc và chiều ngang.
Viết và thoát khỏi file , sau đó xây dựng lại ứng dụng:
- cd widget
- sudo npm run build
Sau khi xây dựng thành công, hãy làm mới https:// your_domain /index.php/ my-react-app /
trong trình duyệt của bạn. Đến đây bạn sẽ thấy hộp mà bạn đã tạo kiểu bằng CSS, cùng với văn bản Hello, World!
:
Tiếp theo, bạn sẽ thêm cài đặt tùy chỉnh, bao gồm màu và kích thước đường viền do user cung cấp. Bạn cũng sẽ chuyển tên hiển thị của user hiện tại từ server .
Cập nhật mã rút gọn để chấp nhận đối số
Để chuyển một đối số do user cung cấp, trước tiên bạn phải cung cấp cho user một cách để truyền một đối số. Quay lại terminal , chuyển trở lại cấp cao nhất của plugin của bạn:
- cd ..
Tiếp theo, mở file shortcode.php
của bạn để chỉnh sửa:
- nano includes/shortcode.php
Cập nhật file mã ngắn của bạn để chứa các dòng được đánh dấu sau:
<?php // This file enqueues your shortcode. defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' ); add_shortcode( 'erw_widget', function( $atts ) { $default_atts = array( 'color' => 'black' ); $args = shortcode_atts( $default_atts, $atts ); return "<div class='erw-root'></div>"; });
Viết và thoát khỏi file . Lưu ý cách mã thêm 'color' => 'black'
vào mảng $default_atts
. color
khóa mảng hướng dẫn WordPress mong đợi rằng thuộc tính color
có thể được chuyển tới shortcode [erw_widget]
. Giá trị mảng, black
, đặt giá trị mặc định. Tất cả các thuộc tính shortcode được chuyển cho hàm shortcode dưới dạng chuỗi, vì vậy nếu bạn không muốn đặt giá trị mặc định, bạn có thể sử dụng chuỗi trống ( ''
) để thay thế. Dòng cuối cùng thay đổi để sử dụng một lớp thay vì một ID vì dự kiến sẽ có nhiều hơn một phần tử trong trang.
Bây giờ, hãy quay lại trình duyệt của bạn và nhấp vào nút Chỉnh sửa bên dưới Hello, World!
cái hộp. Cập nhật trang WordPress trong trình duyệt của bạn để thêm version thứ hai của shortcode và thêm thuộc tính màu cho cả hai version . Hướng dẫn này sẽ sử dụng [erw_widget color="#cf6f1a"]
và [erw_widget color="#11757e"]
:
Nhấp vào nút Cập nhật màu xanh lam để lưu.
Lưu ý: Tiện ích thứ hai sẽ chưa hiển thị. Bạn cần cập nhật ứng dụng React để mong đợi nhiều trường hợp được xác định bởi một lớp thay vì một trường hợp duy nhất được xác định bởi một ID.
Tiếp theo, mở index.js
để chỉnh sửa:
- sudo nano widget/src/index.js
Cập nhật nó với những điều sau:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import * as serviceWorker from './serviceWorker'; const App = () => ( <div className="App"> <span className="App__Message">Hello,<br />World!</span> </div> ); const targets = document.querySelectorAll('.erw-root'); Array.prototype.forEach.call(targets, target => ReactDOM.render(<App />, target)); serviceWorker.unregister();
Viết và thoát khỏi file . Các dòng được cập nhật sẽ gọi ứng dụng React trên mỗi version với lớp erw-root
. Vì vậy, nếu mã ngắn được sử dụng hai lần, hai hình vuông sẽ xuất hiện trong trang.
Cuối cùng, mở index.css
để chỉnh sửa:
- sudo nano widget/src/index.css
Cập nhật file để chứa dòng được đánh dấu sau:
.erw-root { display: inline-block; } .App { width: 100px; height: 100px; border: 1px solid; display: inline-block; margin-right: 20px; position: relative; } .App .App__Message { font-size: 15px; line-height: 15px; position: absolute; top: 50%; transform: translateY(-50%); text-align: center; width: 100%; }
Với dòng được thêm này, nhiều tiện ích con liền kề sẽ xuất hiện cạnh nhau thay vì một tiện ích con ở trên cái kia.
Lưu và thoát khỏi file .
Bây giờ, hãy biên dịch lại ứng dụng React của bạn:
- cd widget
- sudo npm run build
Bây giờ, nếu bạn làm mới trang trong trình duyệt của bạn , bạn sẽ thấy cả hai tiện ích:
Chú ý rằng các widget vẫn không hiển thị màu viền. Điều này sẽ được giải quyết trong một phần trong tương lai.
Nhận dạng duy nhất từng trường hợp tiện ích con
Để xác định duy nhất từng tiện ích con, cần phải chuyển một ID từ server . Điều này có thể được thực hiện thông qua thuộc tính data-id
của phần tử root . Điều này rất quan trọng vì mỗi tiện ích con trên trang có thể có các cài đặt khác nhau.
Để thực hiện việc này, hãy quay lại folder plugin cấp cao nhất của bạn và mở shortcode.php
để chỉnh sửa:
- cd ..
- nano includes/shortcode.php
Cập nhật nó để có các dòng được đánh dấu sau:
<?php // This file enqueues your shortcode. defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' ); add_shortcode( 'erw_widget', function( $atts ) { $default_atts = array( 'color' => 'black' ); $args = shortcode_atts( $default_atts, $atts ); $uniqid = uniqid('id'); return "<div class='erw-root' data-id='{$uniqid}'></div>"; });
Dòng mới đầu tiên tạo một ID duy nhất với id
tiền tố. Dòng cập nhật sẽ đính kèm ID vào React root bằng cách sử dụng thuộc tính data-id
. Điều này sẽ làm cho ID có thể truy cập được trong React.
Lưu file , nhưng chưa thoát khỏi nó.
Ghi Cài đặt vào Đối tượng window
JavaScript
Trong file shortcode, bạn sẽ ghi các cài đặt vào trang trong một đối tượng JavaScript global cửa sổ. Sử dụng đối tượng window
đảm bảo nó có thể được truy cập từ bên trong React.
Với shortcode.php
vẫn đang mở, hãy cập nhật nó để nó chứa những thứ sau:
<?php // This file enqueues your shortcode. defined( 'ABSPATH' ) or die( 'Direct script access disallowed.' ); add_shortcode( 'erw_widget', function( $atts ) { $default_atts = array( 'color' => 'black' ); $args = shortcode_atts( $default_atts, $atts ); $uniqid = uniqid('id'); global $current_user; $display_name = $current_user ? $current_user->display_name : 'World'; ob_start(); ?> <script> window.erwSettings = window.erwSettings || {}; window.erwSettings["<?= $uniqid ?>"] = { 'color': '<?= $args["color"] ?>', 'name': '<?= $display_name ?>', } </script> <div class="erw-root" data-id="<?= $uniqid ?>"></div> <?php return ob_get_clean(); });
Các bản cập nhật này viết một khối <script>
trước mỗi phần tử khởi tạo đối tượng cài đặt window-global và điền nó với dữ liệu được cung cấp trong WP Admin.
Lưu ý: Cú pháp <?=
Là viết tắt của <?php echo
Lưu và thoát khỏi file .
Bây giờ, hãy kiểm tra trang WordPress trong trình duyệt web . Điều này sẽ hiển thị cho bạn HTML cho trang web . Nếu bạn CTRL+F
và tìm kiếm window.erwSettings
, bạn sẽ thấy các cài đặt được ghi vào HTML của trang như sau:
... window.erwSettings = window.erwSettings || {}; window.erwSettings["id5d5f1958aa5ae"] = { 'color': '#cf6f1a', 'name': 'sammy', } ...
Truy xuất cài đặt từ React
Trong ứng dụng React, bạn sẽ truy xuất cài đặt dựa trên ID và chuyển giá trị màu đường viền cho thành phần App
dưới dạng thuộc tính ( prop
). Điều này cho phép Thành phần App
dụng sử dụng giá trị mà không cần biết nó đến từ đâu.
Mở index.js
để chỉnh sửa:
- sudo nano widget/src/index.js
Cập nhật nó để nó chứa các dòng được đánh dấu sau:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import * as serviceWorker from './serviceWorker'; const App = ({ settings }) => ( <div className="App" style={{borderColor: settings.color}}> <span className="App__Message">Hello,<br />{settings.name}!</span> </div> ); const targets = document.querySelectorAll('.erw-root'); Array.prototype.forEach.call(targets, target => { const id = target.dataset.id; const settings = window.erwSettings[id]; ReactDOM.render(<App settings={settings} />, target) }); serviceWorker.unregister();
Lưu file và thoát khỏi editor của bạn.
Ứng dụng React của bạn bây giờ sẽ sử dụng ID duy nhất từ đối tượng window-global window.erwSettings
để truy xuất cài đặt và chuyển chúng vào thành phần App
. Để có hiệu lực, hãy biên dịch lại ứng dụng của bạn:
- cd widget
- sudo npm run build
Sau khi hoàn thành bước cuối cùng này, hãy làm mới trang WordPress trong trình duyệt của bạn. Bạn sẽ thấy màu đường viền do user cung cấp và tên hiển thị do server cung cấp xuất hiện trong các tiện ích:
Kết luận
Trong hướng dẫn này, bạn đã tạo plugin WordPress của riêng mình bằng ứng dụng React bên trong nó. Sau đó, bạn đã xây dựng một shortcode như một cầu nối để làm cho ứng dụng của bạn có thể nhúng vào trong trình tạo trang Quản trị WP và cuối cùng, bạn đã tùy chỉnh tiện ích của bạn trên trang.
Bây giờ, bạn có thể mở rộng ứng dụng React của bạn với sự tự tin rằng cơ chế phân phối của bạn đã được áp dụng. Nền tảng này trong WordPress đảm bảo bạn có thể tập trung vào trải nghiệm phía client và khi ứng dụng của bạn mở rộng và phát triển, bạn có thể dễ dàng thêm nhiều công cụ và kỹ thuật theo hướng production sẽ hoạt động với cài đặt WordPress nào.
Để đọc thêm về những gì bạn có thể làm với nền tảng React vững chắc của bạn , hãy thử khám phá một trong các hướng dẫn sau:
- Cách hiển thị dữ liệu từ API DigitalOcean với React mang đến một trường hợp sử dụng thực tế và thú vị cho React.
- Cách xây dựng ứng dụng quản lý danh sách khách hàng với React và TypeScript cung cấp cách sử dụng nâng cao hơn của React cùng với TypeScript.
Các tin liên quan
Cách cài đặt và cấu hình Laravel với LEMP trên Ubuntu 18.042019-08-01
Cách triển khai và quản lý DNS của bạn bằng OctoDNS trên Ubuntu 18.04
2019-07-23
Cách thiết lập hệ thống bàn trợ giúp với OTRS trên Ubuntu 18.04
2019-06-28
Cách triển khai và quản lý DNS của bạn bằng DNSControl trên Ubuntu 18.04
2019-06-26
Cách cấu hình Cụm Galera với MariaDB trên server Ubuntu 18.04
2019-06-20
Cách backup thư mục lớn với Unison trên Ubuntu 18.04
2019-05-21
Cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu 18.04
2019-04-24
Cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu 16.04
2019-04-24
Cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu 18.04
2019-04-24
Cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu 16.04
2019-04-24