[WordPress] 外掛分享: Genesis REST API Integration

首頁外掛目錄 › Genesis REST API Integration
10+
安裝啟用
★★★★★
5/5 分(1 則評價)
3754 天前
最後更新
問題解決
WordPress 4.0+ v1.1.0 上架:2015-07-25

內容簡介

如果您的網站使用 Genesis 框架,您很有可能使用 Genesis 的鉤子,例如 genesis_before_content 或 genesis_entry_footer。使用 WP REST API 時,預設情況下不會包含通過這些鉤子添加的任何內容。

此外掛程式篩選 API 回應以包含通過 Genesis 鉤子添加的任何內容。它將此內容添加到文章對象回應中,這意味著您無需進行單獨的請求或修改您的請求以獲取數據。只需像標準方式一樣要求文章,例如 /wp-json/wp/v2/posts/1,您就可以從 Genesis 鉤子獲得額外的內容。

示範差異,顯示啟用或停用該外掛程式時的回應

返回的 Genesis 鉤子內容是針對檢索到的特定文章的上下文生成的。上下文將與對於給定的文章、頁面或自定義文章類型的單個文章頁面相匹配。這意味著,如果您有以下代碼:

add_action( 'genesis_before_entry', 'mytheme_output_special_content' );
function mytheme_output_special_content() {
// Only on posts in a specific category
if ( in_category( '5' ) ) {
echo 'Some Content';
}
}

僅當文章實際上屬於類別為 5 時,回應對象上的 ‘genesis_before_entry’ 屬性的值為 ‘Some Content’。所有標准的條件語句,例如 is_archive()、is_single()、has_tag() 等都將得到尊重。

默認情況下,此外掛僅為具有輸出的鉤子添加回應對象中的屬性,但您可以使用篩選器修改此行為,例如:

add_filter( 'genesis_rest_api_return_empty_hooks', '__return_true' );

默認情況下,此外掛在文章、頁面和所有自定義文章類型中僅添加了額外的屬性,但您可以使用另一個篩選器指定要在哪些文章類型中包含額外數據:

add_filter( 'genesis_rest_api_supported_post_types', 'mytheme_genesis_rest_api_supported_post_types' );
function mytheme_genesis_rest_api_supported_post_types( $post_types ) {

// 只為電影自定義文章類型添加數據。
$post_types = array( 'movie' );

return $post_types;
}

注意:在 REST API 的 v2 版本中,自定義文章類型需要將額外屬性 show_in_rest、rest_base 和 rest_controller_class 設置在其文章類型對象上,以便 API 開始為其提供數據。此外我已經在此外掛程式中包含了一個篩選器,以添加這些屬性,因此您可以聲明對 CPT 的 REST API 支持並在一步中添加額外的 Genesis 數據,但默認情況下,該篩選器是關閉的,不會覆盖已設置的屬性(因為如果核心不假定您希望默認情況下所有 CPT 都可公開訪問,那麼我認為我也不應該這樣)。要打開此功能,請使用以下篩選器:

add_filter( 'genesis_rest_api_register_cpt_api_support', '__return_true' );

如果這樣做,您的 CPT 將在與文章類型對象上的官方名稱匹配的路徑上可用,因此,如果文章類型為 ‘movie’,而您有一部 ID 為 8 的電影,則該電影可以在 /wp-json/v2/movie/8 上訪問。最好將路由與核心公約 /posts/ 和 /pages/ 相匹配,因此,如果您想將路徑設置為 /movies/,而不是 /movie/,您只需特別設置 rest_base 屬性即可:

add_action( 'init', 'mytheme_change_cpt_routes', 11 );
funct

外掛標籤

開發者團隊

⬇ 下載最新版 (v1.1.0) 或搜尋安裝

① 下載 ZIP → 後台「外掛 › 安裝外掛 › 上傳外掛」
② 後台搜尋「Genesis REST API Integration」→ 直接安裝(推薦)
📦 歷史版本下載

原文外掛簡介

If your site uses the Genesis framework, it’s likely that you’re making use of Genesis hooks like genesis_before_content or genesis_entry_footer. When using the WP REST API, any content that has been added to these hooks is not included in the response by default.
This plugin filters the response from the API to include any content added via Genesis hooks. It adds this content to the post object response, which means you don’t have to do a separate request or modify your request to get the data. Simply ask for a post in the standard way like /wp-json/wp/v2/posts/1 and you’ll get the extra content from the Genesis hooks.
Example diff showing the response with and without the plugin active
The Genesis hook content that is returned is generated with respect to the context of the specific post being retrieved. The context will match what it would be on the single post page for the given post, page, or custom post type. This means that if you’ve got some code like this:
add_action( 'genesis_before_entry', 'mytheme_output_special_content' );
function mytheme_output_special_content() {
// Only on posts in a specific category
if ( in_category( '5' ) ) {
echo 'Some Content';
}
}

You’ll get back ‘Some Content’ as the value of the property ‘genesis_before_entry’ on the response object only if the post is actually in category 5. All of the standard conditionals like is_archive(), is_single(), has_tag(), etc. will be respected.
By default this plugin only adds properties to the response object for hooks that have output, but you can modify this behavior using a filter like so:
add_filter( 'genesis_rest_api_return_empty_hooks', '__return_true' );

By default this plugin adds the extra properties to posts, pages, and all custom post types, but you can specify which post types you want to include the extra data with another filter:
add_filter( 'genesis_rest_api_supported_post_types', 'mytheme_genesis_rest_api_supported_post_types' );
function mytheme_genesis_rest_api_supported_post_types( $post_types ) {

// Only add data to the movie post type.
$post_types = array( 'movie' );

return $post_types;
}

NOTE: In v2 of the REST API, custom post types need to have the extra properties show_in_rest, rest_base, and rest_controller_class set on their post type objects in order for the API to start serving data for them. I’ve included a filter in this plugin for adding these properties so that you can declare REST API support for CPTs and add the extra Genesis data in one step, but the filter is off by default and won’t override properties that are already set (because if core doesn’t assume you want all your CPTs publicly accessible by default, I don’t think I should either). To turn this functionality on, use the included filter like this:
add_filter( 'genesis_rest_api_register_cpt_api_support', '__return_true' );

If you do this, you’re CPTs will be available at routes that match the official name of the post type found on the post type object, so if your post type is ‘movie’ and you have a movie with an id of 8, the movie will be accessible at /wp-json/v2/movie/8. It’s probably a better idea to match the core convention of /posts/ and /pages/, so if you want to make the route available at /movies/ instead of /movie/ you just need to specifically set the rest_base property like so:
add_action( 'init', 'mytheme_change_cpt_routes', 11 );
function mytheme_change_cpt_routes() {

global $wp_post_types;

$wp_post_types['movie']->rest_base = 'movies';
}

Here’s the full list of all the Genesis hooks that are currently supported:
genesis_before
genesis_before_header
genesis_site_title
genesis_site_description
genesis_header_right
genesis_after_header
genesis_before_content_sidebar_wrap
genesis_before_content
genesis_before_loop
genesis_before_while
genesis_before_entry
genesis_entry_header
genesis_before_entry_content
genesis_entry_content
genesis_after_entry_content
genesis_entry_footer
genesis_after_entry
genesis_after_endwhile
genesis_after_loop
genesis_before_sidebar_widget_area
genesis_after_sidebar_widget_area
genesis_after_content_sidebar_wrap
genesis_before_footer
genesis_footer
genesis_after_footer
genesis_after

And naturally, there is a filter to control which hooks are supported:
add_filter( 'genesis_rest_api_supported_hooks', 'mytheme_genesis_rest_api_supported_hooks' );
function mytheme_genesis_rest_api_supported_hooks( $genesis_hooks ) {

// Only include certian hooks.
$genesis_hooks = array(
'genesis_before_entry',
'genesis_after_entry',
);

return $genesis_hooks;
}

NOTE: The hooks genesis_header and genesis_loop are not included by default because they mostly call other hooks that are included, but you can always add them back in using the genesis_rest_api_supported_hooks filter.
NOTE: Returning formatted HTML over the REST API is not the best way to make use of a REST API to build a website. It would be preferable to return only the raw object data and build all of your HTML on the client side using the object data. With this plugin you can do exactly this with a little help from json_encode:
add_action( 'genesis_before_entry_content', 'mytheme_pass_array' );
function mytheme_pass_array() {

if ( is_single( 124 ) ) {
$json = array(
'a_key' => 'some value',
'another_key' => 'another value',
);
echo json_encode( $json );
}
}

Or the object version:
add_action( 'genesis_after_entry_content', 'mytheme_pass_object' );
function mytheme_pass_object() {

if ( in_category( 2 ) ) {
$json = new stdClass();
$json->some_key = 'some value';
$json->another_key = 'another value';
echo json_encode( $json );
}
}

Passing arbitrary objects and arrays like this really opens up some interesting possibilities.
If you have any ideas for new features or find a bug, please open an issue on Github. Pull requests are also encouraged :).

延伸相關外掛

文章
Filter
Apply Filters
Mastodon