
內容目錄
內容簡介
nclude information relevant to the issue you are reporting.
功能
將所有文章、頁面和 WordPress 設定轉換為 Markdown 和 YAML 格式,可用於 Jekyll(或 Hugo 或任何其他基於 Markdown 和 YAML 的網站引擎)
輸出的內容為用戶查看的內容,而非資料庫中存儲的內容(在導出之前,通過 the_content 附加外掛運行文章內容,從而允許第三方插件修改輸出內容)
將所有 post_content 轉換為 Markdown
將所有 post_meta 和 wp_posts 表格中的欄位轉換為 YAML 前置資料以便 Jekyll 排序
生成包含 wp_options 表格中所有設定的 _config.yml
輸出單個 zip 檔,其中包含 _config.yml、頁面和 _posts 文件夾,其中包含符合 Jekyll 命名慣例的每篇文章的 .md 檔案
無需進行任何設置,只需一個單擊即可完成
使用方法
將插件放置在 /wp-content/plugins/ 文件夾中
在 WordPress 控制台中啟用插件
從 工具 菜單中選擇 導出到 Jekyll
更多信息
參閱完整文檔:
更新日誌
命令行用法
自定文章類型
本地開發
最低要求的 PHP 版本
安全政策
如需報告安全漏洞,請發送電子郵件至 [email protected]。
獲得幫助或報告問題的位置
如需開始使用和一般文檔,請瀏覽並隨時貢獻該項目文檔
對於支援問題(例如“我該怎麼做”的問題),請搜索並如未有答案,請在支援論壇中開啟一個主題。
對於技術問題(例如提交錯誤或功能請求),請搜索並如未創建,請在 GitHub 上開啟問題。
報告問題前的檢查事項
您是否使用最新版本的 WordPress?
您是否使用最新版本的插件?
即使停用所有外掛並使用默認主題,問題是否仍然發生?
您是否嘗試過停用並重新啟用該插件?
是否已報告您的問題?
在問題中包括哪些內容
其他使用者可採取哪些步驟以重新生成問題?
該操作的預期結果是什麼?
實際結果是什麼?
是否有任何屏幕截圖或屏幕錄像可以添加?
僅包含與您報告的問題相關的信息。
外掛標籤
開發者團隊
📦 歷史版本下載
原文外掛簡介
Features
Converts all posts, pages, and settings from WordPress to Markdown and YAML for use in Jekyll (or Hugo or any other Markdown and YAML based site engine)
Export what your users see, not what the database stores (runs post content through the_content filter prior to export, allowing third-party plugins to modify the output)
Converts all post_content to Markdown
Converts all post_meta and fields within the wp_posts table to YAML front matter for parsing by Jekyll
Generates a _config.yml with all settings in the wp_options table
Outputs a single zip file with _config.yml, pages, and _posts folder containing .md files for each post in the proper Jekyll naming convention
Selective export: Export only specific categories, tags, or post types using WP-CLI
No settings. Just a single click.
Usage
Place plugin in /wp-content/plugins/ folder
Activate plugin in WordPress dashboard
Select Export to Jekyll from the Tools menu
More information
See the full documentation:
Changelog
Command-line-usage
Selective export by category or tag
Custom post types
Custom fields
Developing locally
Minimum required PHP version
Selective Export by Category or Tag
This feature allows you to export only a specific subset of your WordPress content, filtered by category, tag, or post type. This is particularly useful when:
You have a large WordPress site but only need to convert specific sections
You want to migrate content by topic or category
You need to export content incrementally
Using WP-CLI
The easiest way to perform selective exports is via WP-CLI commands.
Export by Category
To export posts from a single category, use the category slug:
`bash
wp jekyll-export –category=technology > technology-export.zip
`
To export from multiple categories (OR logic – posts in any of these categories):
`bash
wp jekyll-export –category=tech,news,updates > export.zip
`
Export by Tag
To export posts with a specific tag:
`bash
wp jekyll-export –tag=featured > featured-export.zip
`
To export posts with multiple tags (OR logic):
`bash
wp jekyll-export –tag=featured,popular > export.zip
`
Export Specific Post Types
To export only pages:
`bash
wp jekyll-export –post_type=page > pages-export.zip
`
To export only posts:
`bash
wp jekyll-export –post_type=post > posts-export.zip
`
To export custom post types:
`bash
wp jekyll-export –post_type=portfolio,testimonial > custom-export.zip
`
Combining Filters
You can combine multiple filters. Posts must match ALL specified filters (AND logic):
`bash
Export posts that are in "technology" category AND have "featured" tag
wp jekyll-export --category=technology --tag=featured --post_type=post > export.zip
`
Using PHP Filters
For more programmatic control, you can use WordPress filters directly in your theme’s functions.php or a custom plugin.
Filter by Category
`php
add_filter( ‘jekyll_export_taxonomy_filters’, function() {
return array(
‘category’ => array( ‘technology’, ‘science’ ),
);
} );
`
Filter by Tag
`php
add_filter( ‘jekyll_export_taxonomy_filters’, function() {
return array(
‘post_tag’ => array( ‘featured’, ‘popular’ ),
);
} );
`
Filter by Custom Taxonomy
`php
add_filter( ‘jekyll_export_taxonomy_filters’, function() {
return array(
‘my_custom_taxonomy’ => array( ‘term-slug-1’, ‘term-slug-2’ ),
);
} );
`
Combine Multiple Taxonomies
`php
add_filter( ‘jekyll_export_taxonomy_filters’, function() {
return array(
‘category’ => array( ‘technology’ ),
‘post_tag’ => array( ‘featured’ ),
‘custom_tax’ => array( ‘term-1’ ),
);
} );
`
Filter Post Types
`php
add_filter( ‘jekyll_export_post_types’, function() {
return array( ‘post’, ‘page’ ); // Only export posts and pages
} );
`
Finding Category and Tag Slugs
If you’re not sure what slug to use:
Via WordPress Admin
Go to Posts > Categories or Posts > Tags
Hover over the category/tag name
Look at the browser’s status bar or the URL – you’ll see something like tag_ID=123&taxonomy=post_tag&term_slug=featured
The slug is the part after term_slug=
Via WP-CLI
List all categories with their slugs:
`bash
wp term list category –fields=name,slug
`
List all tags with their slugs:
`bash
wp term list post_tag –fields=name,slug
`
Use Cases
Scenario 1: Export a Single Blog Section
You have a WordPress site with multiple sections (Tech, Lifestyle, Travel) and want to move just the Tech section to a static site:
`bash
wp jekyll-export –category=tech > tech-blog-export.zip
`
Scenario 2: Export Featured Content
You want to export only posts marked as “featured” for a special showcase site:
`bash
wp jekyll-export –tag=featured > featured-content.zip
`
Scenario 3: Export by Year (using custom taxonomy)
If you’ve tagged posts by year, you can export by year:
`bash
wp jekyll-export –tag=2024 > 2024-posts.zip
`
Scenario 4: Migrate Content Incrementally
Export different categories separately for incremental migration:
`bash
wp jekyll-export –category=tech > tech.zip
wp jekyll-export –category=news > news.zip
wp jekyll-export –category=reviews > reviews.zip
`
Technical Details
Taxonomy Filtering: Uses WordPress term slugs (not names or IDs)
Query Performance: Filtering is done at the database level for efficiency
OR Logic Within Taxonomy: Multiple terms in the same taxonomy use OR logic (e.g., posts in category A OR B)
AND Logic Across Taxonomies: Multiple taxonomies use AND logic (e.g., posts in category A AND having tag B)
Post Type Filtering: Works independently of taxonomy filtering
Limitations
Revisions are excluded when using taxonomy filters (as they don’t have taxonomy terms)
Taxonomy filtering uses term slugs, not term IDs or names
Empty taxonomy filters are ignored (no filtering applied)
Troubleshooting
No Posts Exported
If your export is empty:
Check the slug: Make sure you’re using the term slug, not the name
Use wp term list category to verify the exact slug
Check post status: Only published, future, and draft posts are exported
Verify taxonomy: Make sure you’re using the correct taxonomy name (category, post_tag, etc.)
Wrong Posts Exported
If you’re getting unexpected posts:
Check term associations: Verify which posts have the category/tag assigned
Review filter logic: Remember that multiple categories use OR logic
Clear cache: If testing, use wp cache flush between exports
Custom post types
To export custom post types, you’ll need to add a filter (w.g. to your themes config file) to do the following:
`php
add_filter( ‘jekyll_export_post_types’, function() {
return array(‘post’, ‘page’, ‘you-custom-post-type’);
});
`
The custom post type will be exported as a Jekyll collection. You’ll need to initialize it in the resulting Jekyll site’s _config.yml.
Developing locally
Option 1: Using Dev Containers (Recommended)
The easiest way to get started is using VS Code Dev Containers or GitHub Codespaces:
Install VS Code and the Dev Containers extension
git clone https://github.com/benbalter/wordpress-to-jekyll-exporter
Open the folder in VS Code
Click “Reopen in Container” when prompted
Wait for the container to build and dependencies to install
Access WordPress at http://localhost:8088
The devcontainer includes:
– Pre-configured WordPress and MySQL
– All PHP extensions and Composer dependencies
– VS Code extensions for PHP development, debugging, and testing
– WordPress coding standards configured
See .devcontainer/README.md for more details.
Option 2: Manual Setup
Prerequisites
sudo apt-get update
sudo apt-get install composer
sudo apt-get install php7.3-xml
sudo apt-get install php7.3-mysql
sudo apt-get install php7.3-zip
sudo apt-get install php-mbstring
sudo apt-get install subversion
sudo apt-get install mysql-server
sudo apt-get install php-pear
sudo pear install PHP_CodeSniffer
Bootstrap & Setup
git clone https://github.com/benbalter/wordpress-to-jekyll-exporter
cd wordpress-to-jekyll-exporter
script/bootstrap
script/setup
Option 3: Docker Compose Only
git clone https://github.com/benbalter/wordpress-to-jekyll-exporter
docker-compose up
open localhost:8088
Running tests
script/cibuild
Custom fields
When using custom fields (e.g. with the Advanced Custom fields plugin) you might have to register a filter to convert array style configs to plain values.
Available Filters
The plugin provides two filters for customizing post metadata:
jekyll_export_meta: Filters the metadata for a single post before it’s merged with taxonomy terms. Receives $meta array as the only parameter.
jekyll_export_post_meta: Filters the complete metadata array (including taxonomy terms) just before it’s written to the YAML frontmatter. Receives $meta array and $post object as parameters. This is the recommended filter for most use cases.
Note: As of the latest version, the plugin no longer automatically removes empty or falsy values from the frontmatter. All metadata is preserved by default. If you want to remove certain fields, you can use the jekyll_export_post_meta filter to customize this behavior.
By default, the plugin saves custom fields in an array structure that is exported as:
`php
[“my-bool”]=>
array(1) {
[0] => string(1) “1”
}
[“location”]=>
array(1) {
[0] => string(88) “My address”
}
`
And this leads to a YAML structure like:
`yaml
my-bool:
– “1”
location:
– ‘My address’
`
This is likely not the structure you expect or want to work with. You can convert it using a filter:
`php
add_filter( ‘jekyll_export_meta’, function($meta) {
foreach ($meta as $key => $value) {
if (is_array($value) && count($value) === 1 && array_key_exists(0, $value)) {
$meta[$key] = $value[0];
}
}
return $meta;
});
`
A more complete solution could look like that:
`php
add_filter( ‘jekyll_export_meta’, function($meta) {
foreach ($meta as $key => $value) {
// Advanced Custom Fields
if (is_array($value) && count($value) === 1 && array_key_exists(0, $value)) {
$value = maybe_unserialize($value[0]);
// Advanced Custom Fields: NextGEN Gallery Field add-on
if (is_array($value) && count($value) === 1 && array_key_exists(0, $value)) {
$value = $value[0];
}
}
// convert types
$value = match ($key) {
// Advanced Custom Fields: “true_false” type
‘my-bool’ => (bool) $value,
default => $value
};
$meta[$key] = $value;
}
return $meta;
});
`
Removing Empty or Falsy Values
If you want to remove empty or falsy values from the frontmatter (similar to the pre-3.0.3 behavior), you can use the jekyll_export_post_meta filter:
`php
add_filter( ‘jekyll_export_post_meta’, function( $meta, $post ) {
foreach ( $meta as $key => $value ) {
// Remove falsy values except numeric 0
if ( ! is_numeric( $value ) && ! $value ) {
unset( $meta[ $key ] );
}
}
return $meta;
}, 10, 2 );
`
Command-line Usage
If you’re having trouble with your web server timing out before the export is complete, or if you just like terminal better, you may enjoy the command-line tool.
It works just like the plugin, but produces the zipfile on STDOUT:
`
php jekyll-export-cli.php > jekyll-export.zip
`
If using this method, you must run first cd into the wordpress-to-jekyll-exporter directory.
Alternatively, if you have WP-CLI installed, you can run:
`
wp jekyll-export > export.zip
`
The WP-CLI version will provide greater compatibility for alternate WordPress environments, such as when wp-content isn’t in the usual location.
Filtering by Category or Tag
You can export only specific categories or tags using the WP-CLI command. This is useful when you want to convert just one section of your WordPress site instead of the entire corpus.
Export posts from a specific category:
`bash
wp jekyll-export –category=technology > export.zip
`
Export posts from multiple categories:
`bash
wp jekyll-export –category=tech,news,updates > export.zip
`
Export posts with a specific tag:
`bash
wp jekyll-export –tag=featured > export.zip
`
Export only pages (or specific post types):
`bash
wp jekyll-export –post_type=page > export.zip
`
Combine filters:
`bash
wp jekyll-export –category=technology –tag=featured –post_type=post > export.zip
Using Filters in PHP
If you're using the plugin via PHP code or want more control, you can use thejekyll_export_taxonomy_filters` filter:
`php
add_filter( ‘jekyll_export_taxonomy_filters’, function() {
return array(
‘category’ => array( ‘technology’, ‘science’ ),
‘post_tag’ => array( ‘featured’ ),
);
} );
// Then trigger the export
global $jekyll_export;
$jekyll_export->export();
`
Test Coverage Improvements
Overview
This document summarizes the comprehensive testing improvements made to the WordPress to Jekyll Exporter plugin.
Test Files Added
1. `tests/test-cli.php` – CLI Command Tests
Tests for the WP-CLI integration functionality:
– Verifies Jekyll_Export_Command class exists when WP_CLI is defined
– Tests that the command has the required __invoke method
– Validates command instantiation
2. `tests/test-integration.php` – Integration Tests
Comprehensive integration tests for the full export workflow:
– Full export workflow validation (config + posts + uploads)
– Zip file creation and contents verification
– Multi-post type handling (posts, pages, drafts)
– Upload file copying and export
– Special character handling in titles
– End-to-end YAML front matter validation
– Markdown conversion validation
3. `tests/test-edge-cases.php` – Edge Case Tests
Tests for edge cases and error conditions:
– Posts with very long titles
– Unicode characters (émojis, 中文, العربية)
– HTML in post titles
– Table conversion to Markdown
– Shortcode processing
– Serialized post meta data
– Empty post slugs
– Post formats
– Serialized options
– Symbolic links
– Empty post lists
– Invalid dates
Enhanced Tests in `test-wordpress-to-jekyll-exporter.php`
Added comprehensive tests for previously untested or under-tested functions:
New Function Tests
test_filesystem_method_filter() – Verifies the filesystem method filter returns ‘direct’
test_register_menu() – Tests menu registration in WordPress admin
test_zip_folder_empty() – Tests zip creation with empty directories
test_zip_folder_nested() – Tests zip creation with nested directory structures
New Edge Case Tests
test_convert_meta_no_custom_fields() – Tests meta conversion without custom fields
test_convert_meta_with_featured_image() – Tests featured image handling in meta
test_convert_terms_no_terms() – Tests term conversion when no terms exist
test_convert_content_empty() – Tests conversion of empty content
test_convert_content_complex_html() – Tests conversion of complex HTML (headings, links, lists)
test_write_draft() – Tests writing draft posts to _drafts directory
test_write_future() – Tests writing future posts to _posts directory
test_write_subpage() – Tests writing sub-pages with correct paths
test_rename_key_nonexistent() – Tests rename_key with non-existent keys
test_convert_options_filters_hidden() – Tests that hidden options are filtered
test_get_posts_caching() – Tests post caching mechanism
test_copy_recursive_skips_temp() – Tests that temporary directories are skipped
Test Coverage Summary
Previously Tested Functions
✅ Plugin activation
✅ Dependency loading
✅ Getting post IDs
✅ Converting meta (basic)
✅ Converting terms (basic)
✅ Converting content (basic)
✅ Temp directory initialization
✅ Converting posts
✅ Exporting options
✅ Writing files
✅ Creating zip
✅ Cleanup
✅ Rename key
✅ Converting uploads
✅ Copy recursive (basic)
Newly Added Test Coverage
✅ CLI command functionality
✅ Filesystem method filter
✅ Menu registration
✅ Featured images in meta
✅ Complex HTML to Markdown conversion
✅ Draft and future post handling
✅ Sub-page path handling
✅ Empty and edge case content
✅ Hidden option filtering
✅ Post caching
✅ Temporary directory exclusion
✅ Full export workflow integration
✅ Zip contents validation
✅ Multi-post type exports
✅ Unicode character handling
✅ HTML in titles
✅ Table conversion
✅ Shortcode processing
✅ Serialized data handling
✅ Symbolic link handling
✅ Long titles
✅ Post formats
✅ Special characters
Coverage Statistics
Original Test File
Lines: 415
Test Functions: 15
Enhanced Test Files
test-wordpress-to-jekyll-exporter.php: 699 lines (+284), 31 test functions (+16)
test-cli.php: 60 lines (new), 3 test functions (new)
test-integration.php: 247 lines (new), 6 test functions (new)
test-edge-cases.php: 273 lines (new), 15 test functions (new)
= Total …
