{"id":335020,"date":"2026-07-15T09:51:17","date_gmt":"2026-07-15T09:51:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/content-manager-api\/"},"modified":"2026-07-15T11:14:27","modified_gmt":"2026-07-15T11:14:27","slug":"bahricanli-publisher","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/bahricanli-publisher\/","author":204511,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.5","stable_tag":"1.6.5","tested":"7.0.1","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"BahriCanli Publisher","header_author":"Bahri Meri\u00e7 Canl\u0131","header_description":"Connects your WordPress site to content-manager.tr \u2014 publish, update and delete posts via a secure token-based API. Supports featured image sideloading, Gutenberg blocks, categories, tags and author selection. Built and maintained by Bahri Meri\u00e7 Canl\u0131.","assets_banners_color":"4f46e5","last_updated":"2026-07-15 11:14:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/content-manager.tr","header_author_uri":"https:\/\/www.bahricanli.tr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.6.1":{"tag":"1.6.1","author":"bmericc","date":"2026-07-15 09:51:08"},"1.6.2":{"tag":"1.6.2","author":"bmericc","date":"2026-07-15 09:56:20"},"1.6.3":{"tag":"1.6.3","author":"bmericc","date":"2026-07-15 10:00:41"},"1.6.4":{"tag":"1.6.4","author":"bmericc","date":"2026-07-15 10:21:20"},"1.6.5":{"tag":"1.6.5","author":"bmericc","date":"2026-07-15 11:14:27"}},"upgrade_notice":{"1.3.0":"<p>Plugin renamed to BahriCanli Publisher. After upgrading, re-enter your token in Settings \u2192 BahriCanli Publisher. Update the AJAX action names in content-manager.tr if you use the AJAX fallback endpoints.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3608593,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3608593,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3608593,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3608593,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.6.1","1.6.2","1.6.3","1.6.4","1.6.5"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page \u2014 generate or enter your API token."}},"plugin_section":[],"plugin_tags":[1556,569,529,7143,23853],"plugin_category":[],"plugin_contributors":[89251],"plugin_business_model":[],"class_list":["post-335020","plugin","type-plugin","status-publish","hentry","plugin_tags-api","plugin_tags-automation","plugin_tags-content","plugin_tags-publishing","plugin_tags-rest-api","plugin_contributors-bmericc","plugin_committers-bmericc"],"banners":{"banner":"https:\/\/ps.w.org\/bahricanli-publisher\/assets\/banner-772x250.png?rev=3608593","banner_2x":"https:\/\/ps.w.org\/bahricanli-publisher\/assets\/banner-1544x500.png?rev=3608593","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bahricanli-publisher\/assets\/icon-128x128.png?rev=3608593","icon_2x":"https:\/\/ps.w.org\/bahricanli-publisher\/assets\/icon-256x256.png?rev=3608593","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>BahriCanli Publisher<\/strong> is the official WordPress companion plugin for <a href=\"https:\/\/content-manager.tr\">content-manager.tr<\/a> \u2014 an AI-powered multi-site content management system built and maintained by Bahri Meri\u00e7 Canl\u0131.<\/p>\n\n<p>content-manager.tr manages content for multiple WordPress sites simultaneously, generating and scheduling posts with AI assistance. This plugin acts as the bridge: it exposes a secure endpoint that content-manager.tr uses to create, update and delete posts on your site.<\/p>\n\n<p>Once installed and configured, the plugin allows content-manager.tr to:<\/p>\n\n<ul>\n<li><strong>Publish<\/strong> new posts with title, content (Gutenberg blocks supported), excerpt, slug, categories, tags, author and featured image<\/li>\n<li><strong>Update<\/strong> existing posts including replacing the featured image<\/li>\n<li><strong>Delete<\/strong> posts<\/li>\n<li><strong>Sideload featured images<\/strong> from external URLs (Unsplash, Pexels, Pixabay, etc.) directly into the WordPress media library<\/li>\n<li><strong>Auto-resize<\/strong> uploaded images to a maximum width of 1600 px to keep storage lean<\/li>\n<\/ul>\n\n<p>All requests are authenticated with a shared secret token \u2014 no OAuth or WordPress login required.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin makes an outbound HTTP request to the WordPress.org API to check whether a WordPress core update is available. This request is triggered only when the <code>bahrpu_version<\/code> AJAX action is called by the content-manager.tr application.<\/p>\n\n<ul>\n<li>Service: WordPress.org Core Version Check API<\/li>\n<li>URL: <code>https:\/\/api.wordpress.org\/core\/version-check\/1.7\/<\/code><\/li>\n<li>Purpose: Retrieve the latest available WordPress version number<\/li>\n<li>Data sent: No personal data is sent. The request contains only standard HTTP headers.<\/li>\n<li>Privacy policy: https:\/\/wordpress.org\/about\/privacy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>bahricanli-publisher<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Go to <strong>Settings \u2192 BahriCanli Publisher<\/strong>.<\/li>\n<li>Generate or enter a token and copy it to your content-manager.tr app's <code>.env<\/code> file as <code>WORDPRESS_PLUGIN_TOKEN<\/code>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20work%20without%20the%20content-manager.tr%20app%3F\"><h3>Does this plugin work without the content-manager.tr app?<\/h3><\/dt>\n<dd><p>The plugin exposes an API endpoint that can be called by any HTTP client with the correct token. However it is designed and maintained specifically for the content-manager.tr application.<\/p><\/dd>\n<dt id=\"is%20the%20token%20stored%20securely%3F\"><h3>Is the token stored securely?<\/h3><\/dt>\n<dd><p>The token is stored in the WordPress options table using <code>get_option<\/code> \/ <code>update_option<\/code>. It is never exposed in the front end.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20wordpress%20multisite%3F\"><h3>Can I use this with WordPress Multisite?<\/h3><\/dt>\n<dd><p>Each site in a Multisite network needs the plugin activated individually with its own token.<\/p><\/dd>\n<dt id=\"what%20image%20formats%20are%20supported%20for%20sideloading%3F\"><h3>What image formats are supported for sideloading?<\/h3><\/dt>\n<dd><p>JPEG, PNG, WebP and GIF. The plugin detects the format from the downloaded file's MIME type, so URLs without a file extension (common with Unsplash) are handled correctly.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Chore: Added a GitHub-facing README.md alongside readme.txt (WordPress.org still reads readme.txt).<\/li>\n<li>Chore: Deploy action pinned to a fixed commit SHA per automated security review.<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Add: Full Turkish (tr_TR) translation bundled with the plugin. The settings page now automatically\ndisplays in Turkish when the WordPress site's language is set to Turkish, and in English otherwise.<\/li>\n<li>Improve: All settings-page strings are now wrapped for translation (<code>load_plugin_textdomain<\/code>),\nmaking the plugin translation-ready for additional languages in the future.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Fix: readme.txt <code>Contributors<\/code> alan\u0131ndan ge\u00e7ersiz WordPress.org kullan\u0131c\u0131 ad\u0131 (<code>bahricanli<\/code>) kald\u0131r\u0131ld\u0131.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Chore: WordPress.org eklenti sayfas\u0131 i\u00e7in icon\/banner g\u00f6rselleri eklendi (SVN assets\/ dizini).<\/li>\n<li>Chore: Repoda kalan bayat build zip dosyas\u0131 kald\u0131r\u0131ld\u0131. Fonksiyonel bir de\u011fi\u015fiklik yoktur.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Chore: GitHub \u00fczerinden WordPress.org SVN'ine otomatik da\u011f\u0131t\u0131m (GitHub Actions) kuruldu.\nBu, yaln\u0131zca yay\u0131n altyap\u0131s\u0131yla ilgili bir de\u011fi\u015fikliktir; eklenti i\u015flevselli\u011finde bir\nde\u011fi\u015fiklik yoktur.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Fix: Posts published or updated via content-manager.tr now also populate Yoast SEO's per-post\nmeta description field (<code>_yoast_wpseo_metadesc<\/code>) from the post excerpt. Previously the excerpt\nwas only saved to WordPress's native excerpt field, so Yoast's search-result meta description\ntag was left empty whenever the site's own Yoast templates had no fallback configured.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Fix: All internal function names, defines and the AJAX action prefix renamed from the too-short\n  bcp_ to the unique <code>bahrpu_<\/code> prefix, per WordPress.org Plugin Review feedback (naming collisions).<\/li>\n<li>Fix: Removed direct <code>curl_*<\/code> usage for downloading remote images \u2014 now uses the WordPress HTTP API\n(<code>wp_remote_get<\/code>), per WordPress.org Plugin Review feedback.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Add: \"Varsay\u0131lan Yazar\" (Default Author) setting on the settings page \u2014 choose which WordPress user\nnew posts published via content-manager.tr are assigned to (defaults to user ID 1 if unset).<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fix: AJAX post olu\u015fturma\/g\u00fcncellemede yan\u0131t (post_id) art\u0131k \u00f6ne \u00e7\u0131kan g\u00f6rsel indirilip\nboyutland\u0131r\u0131lmadan HEMEN g\u00f6nderiliyor (m\u00fcmk\u00fcnse <code>fastcgi_finish_request()<\/code> ile). \u00d6nceden\nyava\u015f\/ba\u015far\u0131s\u0131z g\u00f6rsel indirme ad\u0131m\u0131 content-manager'\u0131n 45sn zaman a\u015f\u0131m\u0131na neden olup\npost'u \"failed\" i\u015faretliyor, bu da ayn\u0131 yaz\u0131n\u0131n tekrar g\u00f6nderilip WordPress'te m\u00fckerrer\npost olu\u015fmas\u0131na yol a\u00e7\u0131yordu.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Rename: Plugin renamed to BahriCanli Publisher (slug: bahricanli-publisher).<\/li>\n<li>Update: All function prefixes changed to <code>bcp_<\/code>, option key to <code>bahricanli_publisher_token<\/code>.<\/li>\n<li>Update: REST namespace changed to <code>bahricanli-publisher\/v1<\/code>.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fix: Featured image sideloading now works for URLs without a file extension (e.g. Unsplash).<\/li>\n<li>Fix: Media upload permission granted via capability filter for token-authenticated requests.<\/li>\n<li>Fix: Sanitize all <code>$_POST<\/code> fields in fix_images handler.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add: Image resize on upload (max 1600 px width).<\/li>\n<li>Add: <code>fix_images<\/code> AJAX action to sideload external images already in post content.<\/li>\n<li>Add: <code>version<\/code> AJAX action to check installed vs latest WordPress version.<\/li>\n<li>Improve: Fallback from custom cURL downloader to <code>media_sideload_image<\/code> on failure.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>REST API endpoints: POST <code>\/bahricanli-publisher\/v1\/posts<\/code>, PUT <code>\/bahricanli-publisher\/v1\/posts\/{id}<\/code>.<\/li>\n<li>AJAX fallback endpoints for hosts that block the REST API.<\/li>\n<li>Token-based authentication with settings page.<\/li>\n<\/ul>","raw_excerpt":"Connects your WordPress site to content-manager.tr \u2014 publish, update and delete posts via a secure token-based API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335020","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=335020"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bmericc"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335020"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335020"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335020"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335020"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335020"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}