-
-
Save Bicarbona/1727c328d18bd08f4a78a20b1576969d to your computer and use it in GitHub Desktop.
BSS to WordPress - Automatically Publishes Bootstrap Studio Exports to WordPress
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/php | |
<?php | |
/* This script automatically publishes BSS exports to WordPress. | |
* Install Composer from https://getcomposer.org/ . Composer needs to be installed on your local computer where BSS is installed, NOT on the server. | |
* Use Composer to install QueryPath (also on your local computer), following the instructions at https://github.com/technosophos/querypath | |
* On the server, install the JSON Basic Authentication WordPress plugin from https://github.com/WP-API/Basic-Auth | |
* Create an ini file in the bss_exports parent directory, containing values for base_url, wp_username, wp_password. | |
* BSS automatically creates an assets folder in the export directory. This folder contains subfolders for css, images, js, etc... To automatically upload assets, provide ini values for ssh_username, ssh_host, ssh_path (file system path to your public web directory with no trailing slash) | |
* In BSS, create a meta tag for each page you want to publish. <meta name="id" content="POST_ID" /> QP is CASE SENSITIVE, so you must use "id", NOT "ID". Replace POST_ID with the Post ID of the WordPress page. You can obtain this by editing the page in WordPress and viewing the ID in the URL. | |
* The pages must already exist in WordPress before they can be updated by this script. | |
* Configure BSS to run this script on export. BSS will automatically pass the path of the exported files as a parameter to this script. | |
* For each exported page, the script will publish the content of body > div.container or body > div.container-fluid. Make sure the structure of the BSS page conforms to this structure, with the container div immediately following the body tag. | |
* Apache does not allow Basic Authentication by default and will thrown 403 errors. To enable Basic Authenticaiton, add the following line to the .htaccess file in your WordPress web directory: | |
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 | |
You'll need to enable display of hidden files to make .htaccess visible so you can edit it. | |
* If the script doesn't work, try running it from the command line. If you get a PHP "bad interpreter" error, it means some illegal character is interfering with the shebang, possibly a Windows CR/LF. Run the script through dos2unix (installed via brew) and make sure the permissions are 755. | |
*/ | |
require 'vendor/autoload.php'; | |
if (empty($argv[1])) { | |
echo "Export path not specified. Aborting!\n"; | |
exit; | |
} | |
$path = $argv[1]; | |
$params = parse_ini_file("$path/../bss_to_wordpress.ini"); // ini file should be saved in the parent directory of bss_exports | |
$files = scandir($path); | |
foreach ($files as $file) { | |
if (substr($file, -5) == '.html') { | |
$qp = html5qp("$path/$file"); | |
if ($id = $qp->find("meta[name='id']")->attr('content')) { // Get the Post ID stored in the meta id tag. QP is CASE SENSITIVE, so you must use "id", NOT "ID" | |
$content = str_replace('="assets', '="/assets', $qp->find("body > div.container, body > div.container-fluid")->html5()); // Extract the main container content and replace relative references to the assets folder with absolute references | |
$data = json_encode(['content' => $content]); | |
$ch = curl_init($params['base_url'] . "/wp-json/wp/v2/pages/$id"); | |
curl_setopt($ch, CURLOPT_USERPWD, curl_escape($ch, $params['wp_username']) . ":" . $params['wp_password']); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); | |
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($ch, CURLOPT_HTTPHEADER, [ | |
'Content-Type: application/json', | |
'Content-Length: ' . strlen($data) | |
]); | |
$response = curl_exec($ch); | |
} | |
} | |
} | |
shell_exec("rsync -av --delete --size-only '$path/assets' " . $params['ssh_username'] . '@' . $params['ssh_host'] . ':' . $params['ssh_path']); // Sync assets based on size only, deleting any files that don't exist locally | |
shell_exec("rm -rf '$path/assets/'"); // Delete the assets directory structure, so the next export will be clean |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment