WordPress ACF to REST APIで関連記事のアイキャッチ画像を含める
あるサービスの一部がライターさんに直接使ってもらいたいという理由でバックエンドにWordPressを使っている。 最近のWordPressは良くできていて標準でREST APIが叩けるので別のシステムから扱うのが随分楽になった。
別システムから使うため、いろいろな設定項目をWordPress側から変更できるようにしていて、それを実現するためにAdvanced Custom Fields(以下ACF)というプラグインを導入してカスタムフィールドとして本文やタイトル以外の設定ができるようにしている。界隈では結構有名だったと思う。 ただ、ACFを入れるだけではREST APIにカスタムフィールドが出てこないので、さらにACF to REST APIというプラグインも導入している。
ACFではある投稿に対して、別の投稿を紐付けるカスタムフィールドを定義することができ、relations
と呼ばれる。
REST APIである投稿を取得すると、acf
というキーで各種カスタムフィールドがまとめられて返ってくるのだが、そこにはアイキャッチ画像が無い。
本体の記事はfeatured_media
というキーでIDが取得でき、GETパラメータに_embed
を含めるとレスポンスの_embedded.wp:featuredmedia
に画像の詳細が含まれてレスポンスされ、その中に各サイズごとにサイズ, URLなどが含まれる。
そこで、ACF to REST APIのフックを利用して、関連記事に対しても_embed
で画像の情報を含める事ができるようにした。
add_filter( 'acf/rest_api/post/get_fields', 'includeACFFieldsInRESTRelation', 10, 3); function includeACFFieldsInRESTRelation( $data, $request, $response ) { if ( $response instanceof WP_REST_Response ) { $data = $response->get_data(); } remove_filter('acf/rest_api/post/get_fields', 'includeACFFieldsInRESTRelation', 10); if (!empty($data)) { array_walk_recursive($data, 'shallowIncludeACFFields', array('post')); } add_filter( 'acf/rest_api/post/get_fields', 'includeACFFieldsInRESTRelation', 10, 3); return $data; } function shallowIncludeACFFields( &$item, $key, $postTypes, $level=0, $post ) { if (isset( $item->post_type ) && in_array( $item->post_type, $postTypes )) { // アイキャッチ画像が設定されていればIDを`featured_media`に入れる if($media_id = get_post_thumbnail_id($item->ID)) { $item->featured_media = intval($media_id, 10); } // `_embed`の場合は`_embedded`内に画像のメタデータを入れる if(isset($_GET['_embed']) && isset($item->featured_media)) { $media = get_post($media_id); $server = rest_get_server(); $controller = new WP_REST_Posts_Controller($media->post_type); $post_type = get_post_type_object($media->post_type); $request = WP_REST_Request::from_url(rest_url(sprintf('wp/v2/%s/%d', $post_type->rest_base, $media->ID))); $request['context'] = 'embed'; $response = $server->dispatch($request); $response = apply_filters('rest_post_dispatch', rest_ensure_response($response), $server, $request); $item->_embedded = array(); $item->_embedded['wp:featuredmedia'] = array(); $item->_embedded['wp:featuredmedia'][] = $server->response_to_data($response, isset($_GET['_embed'])); } // ACFのフィールドも入れる if($fields = get_fields($item->ID)) { foreach($fields as $key => $value) { $item->acf = $fields; } } } }
$TNTのノードを建てた
メモです。
1ノード建てた場合の最低バランス: 2500TNT ノードの承認コスト: 54TNT(今)
ノードごとにETHのアドレスが必要なので、それぞれに2554TNT配布する必要があって、さらにノードを建てた後に54TNTを送るために手数料分のETHも少々必要
RubyでTSVをパースする
こういうTSVをパースする時
field\tfield2\tfield 3 use "quote" string
CSV.read('file.tsv', quote_char: "\x00", col_sep: "\t", headers: false)
col_sep
には\t
を、quote_char
には\x00
のようにヌル文字を使うとフィールド内で"
等が使われていても問題なくパースできる。
macOSでの最小化したウィンドウを表示する方法
Command-Tab
でアプリケーションを切り換える時に追加でOption
を押すとウィンドウが戻ってくる
Command-m
で最小化。Command-Tab
でアプリケーションを切り換えて目的のアプリまで移動。(Command
を押したままTab
を何度か押す。)Option
を押す。Command
を離す。- ウィンドウが表示される
面倒だね。