Знаете ли, че WordPress.org има JSON API, който можете да използвате, за да търсите WordPress поличите информация плъгини и теми?
Както винаги е добре да започнем със “защо”.
Какво бихме правили с данните от този API?
В моя случай имах нужда да вградя подсказки (auto suggest) за WordPress теми и плъгини. Един от бизнесите ми е qSandbox. Това е WordPress платформа за тестови сайтове, чрез която всеки може да си създаде тестов WordPress сайт или да импортира (изисква платен план) съществуващ такъв за секунди и да тества плъгини/теми или да разработва нова версия на сайта си.
В един от екраните има кутийка, в който хората могат да въведат информация и инсталират плъгини или теми.
Инсталацията може да бъде направена като се зададе връзка частична връзка (WordPress slug) (orbisius-support-tickets) или директна връзка към zip файл за сваляне – https://downloads.wordpress.org/plugin/orbisius-support-tickets.zip
С тази функционалност целта ми беше да улесня моите клиенти, за да не трябва да търсят из компютъра си. Дори спестената секунда е добре.
Демо как съм използвал API на WordPress.org
Първата реализация беше доста неефективна, но частично работише. Търсенето беше лошо, тъй като търсенето се извършваше само по линк (в WP термин slug). За да стигна до списъка с темите и плъгините, трябваше да анализирам SVN хранилището. Дори създадох програмка, която да свали всички readme файлове от всеки плъгин (над 50,000!). Това си беше времеемеко и консумиращо ресурси, както моите, така и тези на WordPress.org.
Радвам се, че WordPress.org има API и реализацията беше доста лесна.
Ако вашата реализация е в контекста на WordPress, можете да проверите как WordPress използва своя API. Потърсете в кода на WordPress функциите plugins_api() и themes_api().
В моя случай ми трябваха само определен брой полета, които да бъдат върнати от API. Който е работил в WordPress.org API е осъзнал нещо готино, че не всички програмисти се нуждаят от всички полета. Така че wordPress.org API има параметър за полета, който можете да използвате, за да укажете кои полета да се върнат от API и кои не. Това води до по-бързи запитвания и отговор, тъй като ще се връщат и прехвърлят по-малко данни през интернет. Ще използвам тази идея в един от следващите ми REST API услуги.
код
Можете да намерите най-актуалната версия на кода на тази връзка.
https://github.com/orbisius/sample_wporg_api_client
<?php /** * This code shows how to fetch data using WordPress.org API to search for plugins and phemes * Blog post link: https://orbisius.com/p4477 * @author Svetoslav Marinov (SLAVI) | https://orbisius.com * @copyright (c) All rights reserved. * @license GPL */ $api_params = [ 'user_agent' => 'Orbisius_wporg_API_tutorial/1.0', 'request[search]' => 'orbisius', /// <<== searched keyword 'request[page]' => 1, 'request[per_page]' => 8, // This is a great idea to only fetch fields that are needed. 'request[fields]' => [ 'name' => true, 'author' => true, 'slug' => true, 'downloadlink' => true, // we don't care about these at all so we want less data for faster transfer 'rating' => false, 'ratings' => false, 'downloaded' => false, 'description' => false, 'active_installs' => false, 'short_description' => false, 'donate_link' => false, 'tags' => false, 'sections' => false, 'homepage' => true, 'added' => false, 'last_updated' => false, 'compatibility' => false, 'tested' => false, 'requires' => false, 'versions' => false, 'support_threads' => false, 'support_threads_resolved' => false, ], ]; ///////////////////////////////////////////////////////////////////////// // Fetching plugins $plugin_search_api_url = 'http://api.wordpress.org/plugins/info/1.1/?action=query_plugins'; $api_url = $plugin_search_api_url; $packaged_params = $api_params; $packaged_params['request']['search'] = 'orbisius'; $packaged_params = http_build_query($packaged_params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $packaged_params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // hmm? curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // hmm? curl_setopt($ch, CURLOPT_TIMEOUT, 10); $content_json_maybe = curl_exec($ch); $error = curl_error($ch); if ( !empty( $error ) ) { echo "Error: $error\n"; $result = curl_getinfo($ch); } else { $result = json_decode( $content_json_maybe, true ); } var_dump($result); curl_close($ch); ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // Fetching themes $theme_search_api_url = 'http://api.wordpress.org/themes/info/1.1/?action=query_themes'; $api_url = $theme_search_api_url; $packaged_params = $api_params; $packaged_params['request']['search'] = 'ocean'; $packaged_params = http_build_query($packaged_params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $packaged_params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // hmm? curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // hmm? curl_setopt($ch, CURLOPT_TIMEOUT, 10); $content_json_maybe = curl_exec($ch); $error = curl_error($ch); if ( !empty( $error ) ) { echo "Error: $error\n"; $result = curl_getinfo($ch); } else { $result = json_decode( $content_json_maybe, true ); } var_dump($result); curl_close($ch); ///////////////////////////////////////////////////////////////////////// exit(0);
Резултат
Това е, което АPI на WordPress.org върща на базата на търсените ключови думи.
Как и за какво ще използвате API на WordPress.org?