{"id":322,"date":"2025-04-22T23:45:35","date_gmt":"2025-04-22T23:45:35","guid":{"rendered":"https:\/\/postsbridge.codeccoop.org\/?page_id=322"},"modified":"2026-02-12T10:26:20","modified_gmt":"2026-02-12T10:26:20","slug":"documentation","status":"publish","type":"page","link":"https:\/\/postsbridge.codeccoop.org\/documentation\/","title":{"rendered":"Documentation"},"content":{"rendered":"\n<div class=\"wp-block-group alignfull has-accent-1-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:75px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns alignfull is-layout-flex wp-container-core-columns-is-layout-5b94735d wp-block-columns-is-layout-flex\" id=\"documentation\">\n<div class=\"wp-block-column is-style-show-tablet-desktop is-layout-flow wp-block-column-is-layout-flow\" style=\"border-right-width:1px;flex-basis:300px\">\n<div class=\"wp-block-group table-of-content has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-4617c55c wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--70);padding-left:var(--wp--preset--spacing--50)\"><nav class=\"has-small-font-size is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-013dbd60 wp-block-navigation-is-layout-flex\" aria-label=\"Documentation\"><ul class=\"wp-block-navigation__container has-small-font-size is-vertical wp-block-navigation\"><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#getting-started\"><span class=\"wp-block-navigation-item__label\">Getting started<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#settings\"><span class=\"wp-block-navigation-item__label\">Setings page<\/span><\/a><\/li><li data-wp-context=\"{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: null }\" data-wp-interactive=\"core\/navigation\" data-wp-on--focusout=\"actions.handleMenuFocusout\" data-wp-on--keydown=\"actions.handleMenuKeydown\" data-wp-on--pointerenter=\"actions.openMenuOnHover\" data-wp-on--pointerleave=\"actions.closeMenuOnHover\" data-wp-watch=\"callbacks.initMenu\" tabindex=\"-1\" class=\"wp-block-navigation-item has-small-font-size has-child open-on-hover-click wp-block-navigation-submenu\"><a class=\"wp-block-navigation-item__content\" href=\"#backends\"><span class=\"wp-block-navigation-item__label\">Backends<\/span><\/a><button data-wp-bind--aria-expanded=\"state.isMenuOpen\" data-wp-on--click=\"actions.toggleMenuOnClick\" aria-label=\"Backends submenu\" class=\"wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle\" ><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M1.50002 4L6.00002 8L10.5 4\" stroke-width=\"1.5\"><\/path><\/svg><\/button><ul data-wp-on--focus=\"actions.openMenuOnFocus\" class=\"wp-block-navigation__submenu-container wp-block-navigation-submenu\"><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#authentication\"><span class=\"wp-block-navigation-item__label\">Authentication<\/span><\/a><\/li><\/ul><\/li><li data-wp-context=\"{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: null }\" data-wp-interactive=\"core\/navigation\" data-wp-on--focusout=\"actions.handleMenuFocusout\" data-wp-on--keydown=\"actions.handleMenuKeydown\" data-wp-on--pointerenter=\"actions.openMenuOnHover\" data-wp-on--pointerleave=\"actions.closeMenuOnHover\" data-wp-watch=\"callbacks.initMenu\" tabindex=\"-1\" class=\"wp-block-navigation-item has-small-font-size has-child open-on-hover-click wp-block-navigation-submenu\"><a class=\"wp-block-navigation-item__content\" href=\"#bridges\"><span class=\"wp-block-navigation-item__label\">Bridges<\/span><\/a><button data-wp-bind--aria-expanded=\"state.isMenuOpen\" data-wp-on--click=\"actions.toggleMenuOnClick\" aria-label=\"Bridges submenu\" class=\"wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle\" ><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M1.50002 4L6.00002 8L10.5 4\" stroke-width=\"1.5\"><\/path><\/svg><\/button><ul data-wp-on--focus=\"actions.openMenuOnFocus\" class=\"wp-block-navigation__submenu-container wp-block-navigation-submenu\"><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#field-mappers\"><span class=\"wp-block-navigation-item__label\">Field mappers<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#tax-mappers\"><span class=\"wp-block-navigation-item__label\">Tax mappers<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#remote-fields\"><span class=\"wp-block-navigation-item__label\">Remote fields<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#json-fingers\"><span class=\"wp-block-navigation-item__label\">Json fingers<\/span><\/a><\/li><\/ul><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#synchronization\"><span class=\"wp-block-navigation-item__label\">Synchronization<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#custom-post-types\"><span class=\"wp-block-navigation-item__label\">Post Types<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#addons\"><span class=\"wp-block-navigation-item__label\">Add-ons<\/span><\/a><\/li><li data-wp-context=\"{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: null }\" data-wp-interactive=\"core\/navigation\" data-wp-on--focusout=\"actions.handleMenuFocusout\" data-wp-on--keydown=\"actions.handleMenuKeydown\" data-wp-on--pointerenter=\"actions.openMenuOnHover\" data-wp-on--pointerleave=\"actions.closeMenuOnHover\" data-wp-watch=\"callbacks.initMenu\" tabindex=\"-1\" class=\"wp-block-navigation-item has-small-font-size has-child open-on-hover-click wp-block-navigation-submenu\"><a class=\"wp-block-navigation-item__content\" href=\"#api\"><span class=\"wp-block-navigation-item__label\">API<\/span><\/a><button data-wp-bind--aria-expanded=\"state.isMenuOpen\" data-wp-on--click=\"actions.toggleMenuOnClick\" aria-label=\"API submenu\" class=\"wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle\" ><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M1.50002 4L6.00002 8L10.5 4\" stroke-width=\"1.5\"><\/path><\/svg><\/button><ul data-wp-on--focus=\"actions.openMenuOnFocus\" class=\"wp-block-navigation__submenu-container wp-block-navigation-submenu\"><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#pbapi\"><span class=\"wp-block-navigation-item__label\">PBAPI<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item is-style-hidden wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#getters\"><span class=\"wp-block-navigation-item__label\">Getters<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#filters\"><span class=\"wp-block-navigation-item__label\">Filters<\/span><\/a><\/li><li class=\"has-small-font-size wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#actions\"><span class=\"wp-block-navigation-item__label\">Actions<\/span><\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-global-padding is-content-justification-left is-layout-constrained wp-container-core-column-is-layout-d525c45f wp-block-column-is-layout-constrained\">\n<div class=\"wp-block-group alignwide is-nowrap is-layout-flex wp-container-core-group-is-layout-5b94735d wp-block-group-is-layout-flex\">\n<div style=\"height:0px;width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer is-style-default wp-container-content-abf6deda\"><\/div>\n\n\n\n<div class=\"wp-block-group alignwide has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-d525c45f wp-block-group-is-layout-constrained\">\n<div style=\"height:0\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Documentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">We are glad to have you here! In our documentation you&#8217;ll find everything you need to work with Posts Bridge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge is a powerful tool to synchronize your WordPress site content with third party systems over HTTP requests. The approach of this plugin is to escape from closed solutions and to bring to the user a set of tools to make him autonomous to set up his own integrations. At the same time, <em>&#8220;With great power comes great responsibility&#8221;<\/em> and basic knowledge of how HTTP and REST APIs works is required.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can complement this documentation with the <a href=\"https:\/\/postsbridge.codeccoop.org\/category\/tutorials\/\">tutorials of the blog<\/a>. If you miss something or think a new tutorial may be interesting for the community, send us a message through the <a href=\"https:\/\/postsbridge.codeccoop.org\/contact-us\/\" data-type=\"page\" data-id=\"462\">contact form<\/a>.<\/p>\n\n\n\n<section class=\"wp-block-group relative has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-154bd575 wp-block-group-is-layout-constrained\" style=\"margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"getting-started\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Getting started<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This guide is an introduction to the Posts Bridge plugin for WordPress. With various examples, this tutorial explains how to setup a bridge that synchronize WordPress posts with remote systems over the network.<\/p>\n\n\n\n<figure class=\"wp-block-video is-style-hidden\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/08\/forms-bridge-tutorial-2-online-video-cutter.com_.mp4\"><\/video><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Set up a backend<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The first step to establish a bridge between your WordPress posts and your backend or service, is to register the backend \/ service connection. On the admin panel, go to <strong>Settings &gt; Posts Bridge<\/strong> to open the plugin&#8217;s settings page and go to the <strong>HTTP<\/strong> tab. If it&#8217;s your first time here, you will find a screen like this:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57bf146&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57bf146\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"555\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-16-1024x555.png\" alt=\"New backend registration form on the HTTP settings ta\" class=\"wp-image-3582 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-16-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-16-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-16-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-16-1536x832.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-16.png 1854w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/555;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A backend is nothing more than a URL, an array of headers and a unique name to identify it. Start by typing a name and a URL and then click the <strong>Add<\/strong> button. Once done, you can add more headers to your backend connection.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">A good practice is to use your backend URL domain as the backend URL, without path, and use the path as part of your bridge endpoints!<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we will work with <a href=\"https:\/\/jsonplaceholder.typicode.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>{JSON} Placeholder<\/strong><\/a>, a free fake and reliable API for testing and prototyping. The idea is to get the mocked posts from its API synchronized with you WordPress posts.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57bf723&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57bf723\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"555\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-1024x555.png\" alt=\"Screenshot of a backend connection to {JSON} Placeholder domain.\" class=\"wp-image-3641 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-1536x832.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18.png 1854w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/555;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Connect your posts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once you have your backend connection configured, you can start using it on your bridges. Let&#8217;s bridge our posts to <strong>{JSON} Placeholder<\/strong>. Go to the <strong>REST API<\/strong> tab and create a new bridge. A bridge needs a post type, a foreign key, a backend, an HTTP method, an endpoint, and, optional, a single endpoint pattern. Depending on the add-on you use, the bridge will need more or less fields.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\">The <strong>foreign key<\/strong> field is the attribute name of the backend record that will be used as primary key, or ID. <\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\">The bridge <strong>endpoint<\/strong> field should point to the backend endpoint that returns the list of records to get synchronized. Following the convention, to load data for a single record, Posts Bridge will append the record ID as the last part of the endpoint as follows: <code>\/api\/posts =&gt; \/api\/posts\/123<\/code>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\">The <strong>single endpoint pattern<\/strong> allows you to indicate a rewrite rule to be used when the bridge fetches data for a single record of your backend or service. Use the <code>{id}<\/code> there where the record ID has to be replaced (e.g. <code>\/api\/post\/detail\/{id}<\/code>).<\/p>\n<\/div>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c0d27&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c0d27\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"555\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-1024x555.png\" alt=\"\" class=\"wp-image-3643 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-1536x832.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20.png 1854w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/555;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we&#8217;ve specified the following values:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Post type:<\/strong> <code>post<\/code><\/li>\n\n\n\n<li><strong>Foreign key:<\/strong> <code>id<\/code><\/li>\n\n\n\n<li><strong>Backend:<\/strong> <code>JSON Placeholder <\/code><\/li>\n\n\n\n<li><strong>Endpoint:<\/strong> <code>\/posts<\/code><\/li>\n\n\n\n<li><strong>Single endpoint pattern:<\/strong> <code>\/posts\/{id}<\/code><\/li>\n\n\n\n<li><strong>Method:<\/strong> GET<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">In addition, in the <strong>Post fields<\/strong> section, we&#8217;ve mapped the <code>title<\/code> and <code>body<\/code> attributes from the API response records to the <strong>Title<\/strong> and <strong>Content<\/strong> fields of our posts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After that, we have our first bridge ready \ud83c\udf89. Now, click on <strong>Synchronize <\/strong> and Posts Bridge will create as posts in WordPress as posts returns the Placeholder API.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"555\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-21-1024x555.png\" alt=\"Screenshot of the posts collection in the WordPress admin panel after the synchronization.\" class=\"wp-image-3676 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-21-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-21-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-21-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-21-1536x832.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-21.png 1854w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/555;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This is a basic setup. Now, you can schedule and automatic synchronization from the <strong>General<\/strong> tab of the plugin settings to get your posts automatically synchronized in the background.<\/p>\n<\/section>\n\n\n\n<section class=\"wp-block-group relative has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-384f17c9 wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"settings\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Settings page<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To get you to the settings page go to <strong>Settings &gt; Posts Bridge<\/strong> on the admin page of your WordPress site. This page is where you can configure and create your form bridges.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">General settings<\/h3>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c15de&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c15de\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1020\" height=\"1024\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23-1020x1024.png\" alt=\"General settings tab content with synchronization, addons, debug, import \/export and credeit panels visibles\" class=\"wp-image-3847 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23-1020x1024.png 1020w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23-300x300.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23-150x150.png 150w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23-768x771.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23-1530x1536.png 1530w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-23.png 1703w\" data-sizes=\"(max-width: 1020px) 100vw, 1020px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1020px; --smush-placeholder-aspect-ratio: 1020\/1024;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Schedule<\/strong>: Enable or disable automatic background synchronizations.<\/li>\n\n\n\n<li><strong>Recurrence<\/strong>: Time interval to be used for automatic synchronizations.<\/li>\n\n\n\n<li><strong>Add-ons<\/strong>: Activate and deactivate add-ons. Each add-on open a new tab, with new bridges. REST API add-on is enabled by default.<\/li>\n\n\n\n<li><strong>Debug<\/strong>: Activate the logging mode to open the console and get logs of your bridges in real time.<\/li>\n\n\n\n<li><strong>Import \/ Export<\/strong>: Import or export your Posts Bridge configurations as JSON files and move it between instances with easy!<\/li>\n\n\n\n<li><strong>Credits<\/strong>: Credits about the plugin and C\u00f2dec.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">HTTP settings<\/h3>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c1e92&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c1e92\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1759\" height=\"1338\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings.png\" alt=\"HTTP settings tab content with backends and authentication panels visible\" class=\"wp-image-2167 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings.png 1759w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings-300x228.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings-1024x779.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings-768x584.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings-1536x1168.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/http-settings-600x456.png 600w\" data-sizes=\"(max-width: 1759px) 100vw, 1759px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1759px; --smush-placeholder-aspect-ratio: 1759\/1338;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Backends<\/strong>: Backends are reusable and add-on independent. Configure your backend connections on the HTTP tab and reuse them on your add-on tabs.<\/li>\n\n\n\n<li><strong>Authentication<\/strong>: If your backend requires some kind of standard HTTP authentication, you can use this panel to register authentication credentials. There are 7 types of credentials: Basic, Token, Digest, URL, OAuth, Bearer and RPC.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Add-on tabs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Each time you activate a new add-on, a new tab will be visible in the settings page. Navigate to this tab and start bridging your posts to the add-on&#8217;s API. To get more detail about add-ons, go the the <a href=\"#addons\">add-ons chapeter<\/a>.<\/p>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"backends\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Backends<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In Posts Bridge, a backend is a set of configurations that handles the connection information and credentials required to get your posts synchronized with remote records over HTTP requests. Go to <strong>Settings &gt; Posts Bridge &gt; HTTP<\/strong> to configure your backend connections.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c2bce&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c2bce\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1854\" height=\"1004\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18.png\" alt=\"Backends panel with the {JSON} Placeholder backend connection setting visible \" class=\"wp-image-3641 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18.png 1854w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-18-1536x832.png 1536w\" data-sizes=\"(max-width: 1854px) 100vw, 1854px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1854px; --smush-placeholder-aspect-ratio: 1854\/1004;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the backends panel, you can configure as many backend connections as you need. To create a new backend connection, you have to set the following fields:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Name<\/strong>: A label to identify the backend. Backend names should be unique as it is the internal identifier Posts Bridge use to bind backends to bridges.<\/li>\n\n\n\n<li><strong>Base URL<\/strong>: The base URL of your backend. The URL should start with http:\/\/ or https:\/\/. This base URL will be prepended to the bridge endpoint on runtime when a bridge is sending form submissions to your backend.<\/li>\n\n\n\n<li><strong>Encoding schema:<\/strong> Select how the bridge payload will be encoded on the HTTP request body. You can use one of the standard schemas, or use a custom one.<\/li>\n\n\n\n<li><strong>Authentication:<\/strong> Chose one of your registered authentication credentials, if required.<\/li>\n\n\n\n<li><strong>Headers<\/strong>: An array of HTTP headers. By default, this table will has the <strong>Content Type<\/strong> header. In addition, you can add as many headers as you want.<\/li>\n<\/ol>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"authentication\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Authentication<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Posts Bridge backend system implements the most common <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Guides\/Authentication\" target=\"_blank\" rel=\"noreferrer noopener\">HTTP authentication standards<\/a>. With authentication credentials you can register user credentials required to perform authenticated requests to your backends. Go to <strong>Settings &gt; Posts Bridge &gt; HTTP<\/strong> to configure your authentication credentials.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c38ef&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c38ef\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1920\" height=\"928\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45.png\" alt=\"Authentication credentials panel with an example of a Bearer credential with keycloak as the authorization server\" class=\"wp-image-2174 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45.png 1920w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45-300x145.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45-1024x495.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45-768x371.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45-1536x742.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/Screenshot-from-2025-07-27-23-59-45-600x290.png 600w\" data-sizes=\"(max-width: 1920px) 100vw, 1920px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1920px; --smush-placeholder-aspect-ratio: 1920\/928;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">On the authentication panel you can configure as many credentials as you need. To create a new credential you have to chose between the 5 available authentication schemas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Basic:<\/strong> In basic HTTP authentication, a request contains a header field in the form of <code>Authorization: Basic &lt;credentials&gt;<\/code>, where <code>&lt;credentials&gt;<\/code> is the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Base64\" target=\"_blank\" rel=\"noopener\">Base64<\/a> encoding of <code>client_id<\/code> and <code>client_secret<\/code> joined by a single colon <code>:<\/code>.<\/li>\n\n\n\n<li><strong>Token:<\/strong> In token HTTP authentication, a request contains a header field in the form of <code>Authorization: token &lt;credentials&gt;<\/code>, where <code>&lt;credentials&gt;<\/code> is the <code>client_id<\/code> and <code>client_secret<\/code> joined by a single colon <code>:<\/code> as plain text.<\/li>\n\n\n\n<li><strong>URL:<\/strong> A variation of the basic schema where the <code>client_id<\/code> and <code>client_secret<\/code> are placed on the request URL as plain text values as follows <code>https:\/\/&lt;client_id&gt;:&lt;client_secret&gt;@&lt;backend_url&gt;<\/code>.<\/li>\n\n\n\n<li><strong>Digest:<\/strong> It applies a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Hash_function\" target=\"_blank\" rel=\"noopener\">hash function<\/a> to the <code>client_id<\/code>, <code>realm<\/code> and <code>client_secret<\/code> before sending them over the network with usage of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cryptographic_nonce\" target=\"_blank\" rel=\"noopener\">nonce<\/a> values.<\/li>\n\n\n\n<li><strong>OAuth:<\/strong> OAuth provides a method for clients to access a protected resource on behalf of a resource owner. In the general case, before a client can access a protected resource, it must first obtain an authorization grant from the resource owner and then exchange the authorization grant for an access token. The <code>client_id<\/code>, <code>client_secret<\/code> and <code>scope<\/code> fields are used to get this authorization grant performing an authentication request to the <code>Authorization URL<\/code>.<\/li>\n\n\n\n<li><strong>Bearer:<\/strong> Bearer Tokens are security tokens that grants the &#8220;bearer&#8221; (i.e., the party presenting the token) access to protected resources. The <code>access_token<\/code>field of the credential will be sent in the HTTP <code>Authorization<\/code> header as follows: <code>Authorization: Bearer &lt;token&gt;<\/code>. <\/li>\n\n\n\n<li><strong>RPC:<\/strong> In RPC authentication, the <code>client_id<\/code>, <code>client_secret<\/code> and <code>database<\/code> parameters are shared with the backend as the payload of an RPC login call to obtain the user ID and session required to perform authorized requests.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on the schema you chose, the credential form will require more or less fields.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once you have your credentials registered, you can use them on your backend connection settings. If a backend has an authentication credential registered, Posts Bridge will apply the authentication schema to get authorized access to the backend resources.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">The OAuth schema requires an authorization request to the authorization server to obtain access and refresh tokens. This requests has to be done on registration time and once done successfully, the tokens will be stored on the database. If an OAuht credential has been authorized by the server, the credential will be frozen until you revoke the stored tokens.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-2);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">API keys are not part of an HTTP authentication standard schema. If your backend use this kind of authentication, simply register it as an HTTP header in the backend.<\/p>\n<\/div>\n<\/section>\n<\/section>\n\n\n\n<section class=\"wp-block-group is-style-default has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"bridges\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Bridges<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Think of a bridge as a mapping that links your backend data with a post type collection from your WordPress web page. <strong>Each item on your backend database will be converted to a post<\/strong>, and each field on your backend records can be mapped to a post field, post meta or taxonomy terms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once you link a post type to an endpoint from your backend API, you get a <strong>Remote CPT<\/strong>. Remote CPTs are a special type of posts that can fetch data over HTTP requests on render time and stay synchronized with your backend state.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With bridges you can connect your WordPress posts to any kind of backend, it doesn\u2019t matter if it is a CRM, an ERP, a booking system or an online spreadsheet, the only requirement is an HTTP API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A bridge is tied to an API, so to create bridges you need to have at least one add-on enabled. Each Posts Bridge add-on comes with a new bridge class with the ability to communicate with the respective API. Posts Bridge have REST API bridges enabled by default.<\/p>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"field-mappers\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Field mappers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Field mappers are relations between backend record fields and WordPress post fields. For each bridge, Posts Bridge allows you to map foreign fields to standard post fields, or to arbitrary custom fields.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A field mappers has two parts:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Name<\/strong>: The standard WordPress post field, or custom field name.<\/li>\n\n\n\n<li><strong>Foreign<\/strong>: The attribute name from the backend response to be mapped to the post field.<\/li>\n<\/ol>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c5320&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c5320\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"555\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-1024x555.png\" alt=\"\" class=\"wp-image-3643 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20-1536x832.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-20.png 1854w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/555;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">In the field mappers table, you can use the introspection API of Posts Bridge to get information about the fields schema of the bridge endpoint. Simply click on the button <mark style=\"background-color:#43437a\" class=\"has-inline-color has-base-color\">{&#8230;}<\/mark> to get a list of all its fields and its types.<\/p>\n<\/div>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"tax-mappers\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Tax mappers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Works as field mappers, but each mapped value from the backend responses will be registered as a new taxonomy term in WordPress. For tax mappers, you can pass single values or arrays. During the mapping, Posts Bridge will transform the foreign value to an array if it isn&#8217;t. On synchronization, each item of the array of values will be registered as a taxonomy term.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">Posts Bridge will only show tax mappers if the current post type supports, at least, one taxonomy.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">If you have custom taxonomies, Posts Bridge will show them on the bridge mappers table.<\/p>\n<\/div>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-bottom:0\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"json-fingers\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Json fingers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A json finger is a hierarchical pointer to data structures like <code>children[0].name.rendered<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Json fingers are used by Posts Bridge as field names to allow the user to traverse complex data structures from the backend responses while synchronizing posts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The syntax is inspired on the JSON standard, hence the name. If JSON is unknown to you, start by <a href=\"https:\/\/www.w3schools.com\/js\/js_json_syntax.asp\" target=\"_blank\" rel=\"noopener\">reading about the JSON syntax<\/a> and then, a good playground to learn the concept is the <a href=\"https:\/\/jsonpathfinder.com\/\" target=\"_blank\" rel=\"noopener\">jsonpathfinder project<\/a>, give it a whirl.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Json fingers are can be used as foreign names of field mappers, or as remote field names.<\/strong> If your json finger is simple (without path hierarchy), it works as a simple field name, but a the same time, you can break the name into hierarchy levels get the nested values of a backend response.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, if your backend returns a payload like this:<\/p>\n\n\n\n<pre class=\"wp-block-code has-xx-small-font-size\"><code>{\n  \"name\": \"Bob\",\n  \"address\": {\n    \"street\": \"Carrer de Balmes, 250\",\n\t\"city\": \"Barcelona\"\n  }\n}<\/code><\/pre>\n\n\n\n<div style=\"height:var(--wp--preset--spacing--40)\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Then you can use <code>address.street<\/code> and <code>address.city<\/code> fingers to point to this nested attributes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use them as field mappers foreign names to retrive nested attributes, or as remote field names to render nested values from your backend responses in your post templates and content.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Take a look at our <a href=\"https:\/\/formsbridge.codeccoop.org\/deep-dive-into-field-mappers\/\" data-type=\"post\" data-id=\"963\" target=\"_blank\" rel=\"noopener\">Deep dive into json fingers tutorial<\/a> if you want to realize the full potential of the json finger syntax.<\/p>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"remote-fields\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Remote fields<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge includes the <strong>Remote fields<\/strong> custom block to be used inside the WordPress editor. You can use it both, when editing posts templates and when writing post content. This block allows you <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This block allows you to use remote field placeholder marks in the content of your posts. On render time, Posts Bridge will request those field values to the backend and replace them dynamically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A remote field placeholder mark looks like <code>{{fieldName}}<\/code>, with the name of the field between curly brackets. Place them there where you want your backend fields to be shown and Posts Bridge will do the rest.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c6ecf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c6ecf\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"497\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-24-1024x497.png\" alt=\"Example of a remote field custom block inside the post editor with two replacement marks: {{name}} and {{email}}.\" class=\"wp-image-3889 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-24-1024x497.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-24-300x146.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-24-768x373.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-24-1536x746.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-24.png 1912w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/497;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/section>\n<\/section>\n\n\n\n<section class=\"wp-block-group is-style-default has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"synchronization\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Synchronization<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge treats post collections as indexes that represents your backend data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge offers two strategies for content synchronization:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ahead of time<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On each synchronization loop, if your bridge has field mappers, Posts Bridge will fetch data for each record and insert in the database its attribute values as post fields, post meta or taxonomy terms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This strategy increase synchronization workloads as requires Posts Bridge to dispatch a request for each item in the synchronization loop. An other drawback of this strategy is that remote data updates only will be visible after the next scheduled synchronization loop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In return, after each synchronization loop you will have your data inside the WordPress database, which allows page fastest page renders and the use all the WordPress features, such as taxonomy archives and filters or show post excerpts.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"500\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/ahead-of-time-1-1024x500.png\" alt=\"\" class=\"wp-image-3564 lazyload\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/500;aspect-ratio:2.0480611858279265;width:500px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/ahead-of-time-1-1024x500.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/ahead-of-time-1-300x146.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/ahead-of-time-1-768x375.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/ahead-of-time-1-1536x750.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/ahead-of-time-1.png 2000w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Lazy loading<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In case your bridges does not use field mappers, Posts Bridge will only synchronize foreign IDs on each synchronization loop, and, for each foreign ID, insert an empty post in the database. During renders, you have to use the remote fields custom block to dynamically load record data and map attributes to the post content elements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This strategy allows light synchronization loops as only the list of foreign IDs has to be fetched from the backend. On render time, record data will be fetched, which ensures that the rendered data is always updated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The drawback of this strategy is that each page render will require some time to load remote data. This can lead to several performance issues if you plan to show your posts as archives.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"500\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/live-fetches-2-1024x500.png\" alt=\"\" class=\"wp-image-3568 lazyload\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/500;aspect-ratio:2.0480008066487296;width:500px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/live-fetches-2-1024x500.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/live-fetches-2-300x146.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/live-fetches-2-768x375.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/live-fetches-2-1536x750.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/live-fetches-2.png 2000w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">Both synchronization strategies are not mutually exclusives. You can use both at the same time. For example, you can use field mappers to get your post title and excerpt to be shown in the posts archive, and remote fields to dynamically fetch record data to be shown in the single post template.<\/p>\n<\/div>\n<\/section>\n\n\n\n<section class=\"wp-block-group is-style-default has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"custom-post-types\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Custom post types<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge allows you to bridge any registered post type from your WordPress site. If you&#8217;ve not registered it yet, you <strong>can register it with Posts Bridge<\/strong>. Go to the <strong>CPTs<\/strong> tab and create a new custom post type. The registration form will inherit the registration defaults, but you can modify its values at any time. The only required fields are <strong>Name<\/strong>, <strong>Label<\/strong> and <strong>Singular label<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7cdf1d71 wp-block-group-is-layout-constrained\" style=\"border-left-color:var(--wp--preset--color--accent-1);border-left-width:4px;margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"wp-block-paragraph\" style=\"margin-top:0;margin-bottom:0\">Take a look to the <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_post_type\/\" target=\"_blank\" rel=\"noreferrer noopener\">official documentation<\/a> to get a more in detail explanation about the post type registration arguments.<\/p>\n<\/div>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a268b57c81a6&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a268b57c81a6\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"555\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-13-1024x555.png\" alt=\"\" class=\"wp-image-3579 lazyload\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-13-1024x555.png 1024w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-13-300x162.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-13-768x416.png 768w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-13-1536x832.png 1536w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/imatge-13.png 1854w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/555;\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we&#8217;ve set <code>event<\/code> as the post type name, and <code>Events<\/code> and <code>Event<\/code> as labels. In addition, we&#8217;ve enabled archives for this type of post.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This panel allows you to register post types without writing code. In addition, <strong>it allows you to register post meta<\/strong>. Simply open the <strong>Custom fields<\/strong> panel and register as many fields as you want. Each field will be registered as custom fields of the post type on registration time.<\/p>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"addons\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Add-ons<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge comes with <strong>free add-ons<\/strong>. Each add-on adds to the plugin new bridges to work with specific APIs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By default, Posts Bridge has the <strong>REST API<\/strong> add-on enabled. This is the generic add-on, with an abstract bridge not tied to any API and with which you can set up bridges to work with any API that implements the REST standard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because the REST API add-on is intended to be abstract, it does not support introspection, so Posts Bridge wont be able to propose you fields and endpoints while configuring your bridges. <strong>Use this kind of bridges to work with your custom APIs.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In addition to the REST API add-on, there are other add-ons tailored to work with specific APIs. To enable or disable this add-ons, go to <strong>Settings &gt; General &gt; Add-ons<\/strong> and select which ones you want to enable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Below you can access the documentation for each one of theme:<\/p>\n\n\n\n<div class=\"wp-block-group alignwide is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-f8e922ec wp-block-group-is-layout-flex\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-11427386 wp-block-columns-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-2486140b wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"475\" height=\"206\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo.png\" alt=\"REST API\" class=\"wp-image-2122 lazyload\" style=\"--smush-placeholder-width: 475px; --smush-placeholder-aspect-ratio: 475\/206;object-fit:contain;width:150px;height:60px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo.png 475w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo-300x130.png 300w\" data-sizes=\"(max-width: 475px) 100vw, 475px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-2486140b wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/airtable\/\"><img decoding=\"async\" width=\"413\" height=\"348\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo.png\" alt=\"Airtable\" class=\"wp-image-3350 lazyload\" style=\"--smush-placeholder-width: 413px; --smush-placeholder-aspect-ratio: 413\/348;object-fit:contain;width:150px;height:60px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo.png 413w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo-300x253.png 300w\" data-sizes=\"(max-width: 413px) 100vw, 413px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-53ed2625 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/dolibarr\/\"><img decoding=\"async\" width=\"360\" height=\"83\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-3.png\" alt=\"Dolibarr\" class=\"wp-image-109 lazyload\" style=\"--smush-placeholder-width: 360px; --smush-placeholder-aspect-ratio: 360\/83;object-fit:contain;width:150px;height:60px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-3.png 360w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-3-300x69.png 300w\" data-sizes=\"(max-width: 360px) 100vw, 360px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-53ed2625 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/google-calendar\/\"><img decoding=\"async\" width=\"700\" height=\"700\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/11\/logo-3.png\" alt=\"Google Calendar\" class=\"wp-image-3064 lazyload\" style=\"--smush-placeholder-width: 700px; --smush-placeholder-aspect-ratio: 700\/700;object-fit:contain;width:55px;height:60px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/11\/logo-3.png 700w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/11\/logo-3-300x300.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/11\/logo-3-150x150.png 150w\" data-sizes=\"(max-width: 700px) 100vw, 700px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-11427386 wp-block-columns-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-53ed2625 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/google-sheets\/\"><img decoding=\"async\" width=\"196\" height=\"270\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-5.png\" alt=\"Google Sheets\" class=\"wp-image-111 lazyload\" style=\"--smush-placeholder-width: 196px; --smush-placeholder-aspect-ratio: 196\/270;object-fit:contain;width:60px;height:60px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-db3dd5f9 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/grist\/\"><img decoding=\"async\" width=\"500\" height=\"500\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo-1.png\" alt=\"Grist\" class=\"wp-image-3351 lazyload\" style=\"--smush-placeholder-width: 500px; --smush-placeholder-aspect-ratio: 500\/500;object-fit:contain;width:150px;height:60px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo-1.png 500w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo-1-300x300.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/01\/logo-1-150x150.png 150w\" data-sizes=\"(max-width: 500px) 100vw, 500px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-db3dd5f9 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/holded\/\"><img decoding=\"async\" width=\"297\" height=\"65\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-6.png\" alt=\"Holded\" class=\"wp-image-113 lazyload\" style=\"--smush-placeholder-width: 297px; --smush-placeholder-aspect-ratio: 297\/65;object-fit:contain;width:150px;height:60px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-53ed2625 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/nextcloud\/\"><img decoding=\"async\" width=\"700\" height=\"467\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo_nextcloud2x-1459969680-edited.png\" alt=\"Nextcloud\" class=\"wp-image-2125 lazyload\" style=\"--smush-placeholder-width: 700px; --smush-placeholder-aspect-ratio: 700\/467;object-fit:contain;width:130px;height:65px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo_nextcloud2x-1459969680-edited.png 700w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo_nextcloud2x-1459969680-edited-300x200.png 300w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/07\/logo_nextcloud2x-1459969680-edited-600x400.png 600w\" data-sizes=\"(max-width: 700px) 100vw, 700px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-11427386 wp-block-columns-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-53ed2625 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/odoo\/\"><img decoding=\"async\" width=\"500\" height=\"194\" data-src=\"https:\/\/formsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-9.png\" alt=\"Odoo\" class=\"wp-image-117 lazyload\" style=\"--smush-placeholder-width: 500px; --smush-placeholder-aspect-ratio: 500\/194;object-fit:contain;width:150px;height:60px\" data-srcset=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-9.png 500w, https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2025\/04\/logo-9-300x116.png 300w\" data-sizes=\"(max-width: 500px) 100vw, 500px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-db3dd5f9 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/postsbridge.codeccoop.org\/documentation\/wordpress\/\"><img decoding=\"async\" width=\"92\" height=\"92\" data-src=\"https:\/\/postsbridge.codeccoop.org\/wp-content\/uploads\/2026\/02\/logo.png\" alt=\"WordPress\" class=\"wp-image-3995 lazyload\" style=\"--smush-placeholder-width: 92px; --smush-placeholder-aspect-ratio: 92\/92;object-fit:contain;width:150px;height:60px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-db3dd5f9 wp-block-group-is-layout-flex\"><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch flex justify-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-53ed2625 wp-block-group-is-layout-flex\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-width:2px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"api\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Posts Bridge has an open API of filters and methods to allow developers to extend Posts Bridge features with PHP. In this chapter we will cover the most interesting of them from the point of view of the developers who wants to integrate their themes or plugins with Posts Bridge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It isn&#8217;t an extensive documentation of the Posts Bridge API. If you want a more in depth knowledge, you can browse the plugin&#8217;s code on <a href=\"https:\/\/github.com\/codeccoop\/posts-bridge\" target=\"_blank\" rel=\"noreferrer noopener\">the github repository \ud83d\udc31\u200d\ud83d\udcbb<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"pbapi\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">PBAPI<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>PBAPI<\/strong> is a global available object that works as a proxy that allows developers to manage Posts Bridge settings and data. This is the list of available PBAPI methods:<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-840aa78d wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_addon<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Gets an add-on instance by slug. Add-ons are only available if they are active.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Add-on slug.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Addon|null<\/code> Add-on instance, if found, null otherwise.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$addon = PBAPI::get_addon( 'dolibarr' );\nif ( $addon &amp;&amp; $addon-&gt;ping( 'Dolibarr' ) ) {\n\t$backend_endpoints = $addon-&gt;get_endpoints( 'Dolibarr', 'POST' );\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_post_types<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Gets the list of registered post types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string[]<\/code> List of post type names.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$post_types = PBAPI::get_post_types();\nforeach ( $post_types as $post_type ) {\n\techo $post_type;\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_custom_post_types<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Gets the list of registered custom post types configurations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array[]<\/code> Custom post types registration data.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$cpts = PBAPI::get_custom_post_types();\nforeach ( $cpts as $name =&gt; $cpt_args ) {\n\tif ( ! $cpt_args&#91;'public'] ) {\n        # do something\n    }\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_custom_post_type<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Gets a custom post type registration data by name<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array|null<\/code> Registration data or null<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$event_data = PBAPI::get_custom_post_type( 'event' );\nif ( $event_data ) {\n\t$event_data&#91;'public'] = true;\n    PBAPI::register_custom_post_type( 'event', $event_data );\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::register_custom_post_type<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Registers a new custom post type in WordPress.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Post type name.<\/li>\n\n\n\n<li><code>array<\/code> Post type registration parameters.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Registration result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$success = PBAPI::register_custom_post_type(\n    'event',\n    array(\n        'label'          =&gt; 'Events',\n        'singular_label' =&gt; 'Event',\n        'public'         =&gt; true,\n        'show_in_rest'   =&gt; true,\n        'rest_base'      =&gt; 'events',\n    ),\n);\n\nif ( ! $success ) {\n\t# handle registration error\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::unregister_custom_post_type<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Unregisters a custom post type from WordPress. Only applies to the custom post types registered with Posts Bridge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Unregistration result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$result = PBAPI::unregister_custom_post_type( 'event' );\nif ( $result ) {\n    # do something\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_remote_cpts<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Gets the list of bridged post type names.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string[]<\/code> List of bridged post type names.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$rcpts = PBAPI::get_remote_cpts();\nforeac ( $rcpts as $rcpt ) {\n    echo $rcpt;\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static FBAPI::get_bridge<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Searches for a bridge by post type name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Post type name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Post_Bridge|null<\/code> Bridge object or null.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$bridge = PBAPI::get_bridge( 'event' );\nif ( $bridge ) {\n\t$events = $bridge-&gt;fetch_all();\n\n    if ( is_wp_error( $response ) ) {\n        # handle error\n    }\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static FBAPI::get_bridges<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Returns the list of available bridges.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Post_Bridge[]<\/code> Array of bridge objects.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$bridges = PBAPI::get_bridges();\nforeach ( $bridges as $bridge ) {\n\t# do something\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static FBAPI::get_addon_bridges<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Returns the list of available bridges filtered by add-on slug.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Add-on slug.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Post_Bridge[]<\/code> Array of bridge objects.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$bridges = PBAPI::get_addon_bridges( 'odoo' );\nforeach ( $bridges as $bridge ) {\n\tif ( ! $bridge-&gt;is_valid ) {\n        continue;\n    }\n\n    # do something\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static FBAPI::save_bridge<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Creates or updates the bridge data in the database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Bridge data.<\/li>\n\n\n\n<li><code>string<\/code> Add-on slug.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Update result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php wp-container-content-9cfa9a5a\"><code>$bridge_data = array(\n    'post_type'     =&gt; 'event',\n    'backend'       =&gt; 'Google Calendar',\n    'endpoint'      =&gt; '\/calendars\/v3\/calendar\/johndoe@example.coop\/events',\n    'method'        =&gt; 'GET',\n    'field_mappers' =&gt; array(\n        array(\n            'name'    =&gt; 'summary',\n            'foreign' =&gt; 'post_title',\n        ),       \n        array(\n            'name'    =&gt; 'description',\n            'foreign' =&gt; 'post_excerpt',\n        ),\n        array(\n            'name'    =&gt; 'start_date',\n            'foreign' =&gt; 'start.date',\n        ),\n        array(\n            'name'    =&gt; 'end_date',\n            'foreign' =&gt; 'end.date',\n        ),\n    ),\n    'tax_mappers' =&gt; array(),\n);\n\n$result = PBAPI::save_bridge( $bridge_data, 'gcalendar' );\nif ( ! $result ) {\n    # handle error\n}\n<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static FBAPI::delete_bridge<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Remove the bridge from the database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Bridge name.<\/li>\n\n\n\n<li><code>string<\/code> Add-on slug.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Update result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$result = PBAPI::delete_bridge( 'events', 'gcalendar' );\nif ( $result ) {\n    # do something\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_backends<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Returns the list of available backends.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Http\\Backend[]<\/code> Array of backend objects.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$backends = PBAPI::get_backends();\nforeach ( $backends as $backend ) {\n\tif ( str_starts_with( $backend-&gt;base_url, 'http:\/\/' ) {\n        $data = $backend-&gt;data();\n        $data&#91;'base_url'] = str_replace( 'http:\/\/', 'https:\/\/', $data&#91;'base_url'] );\n        PBAPI::save_backend( $data );\n    }\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_backend<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Searches for a backend by name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Backend name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Http\\Backend|null<\/code> Backend object or null.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$backend = PBAPI::get_backend( 'Dolibarr' );\nif ( $backend ) {\n\t$response = $backend-&gt;get( '\/api\/index.php\/status' );\n    if ( is_wp_error( $response ) ) {\n         # handle error\n    }\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::save_backend<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Creates or updates the backend data in the database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Backend data.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Update result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$result = PBAPI::save_backend( array(\n    'name'       =&gt; 'Odoo',\n    'base_url'   =&gt; 'https:\/\/erp.example.coop',\n    'headers'    =&gt; array(\n        'Content-Type' =&gt; 'application\/json',\n    ),\n    'credential' =&gt; 'John Doe RPC',\n) );<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::delete_backend<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Removes the backend from the database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Backend name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Update result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$result = PBAPI::delete_backend( 'Odoo' );\nif ( $result ) {\n     # do something\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_credentials<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Returns the list of available HTTP credentials.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Http\\Credential[]<\/code> Array of credential objects.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$credentials = PBAPI::get_credentials();\nforeach ( $credentials as $credential ) {\n\tif ( 'RPC' === $credential-&gt;schema ) {\n        $rpc_credentials&#91;] = $credential;\n    }\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::get_credential<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Searches for a credential by name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Credential name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Http\\Credential|null<\/code> Credential object or null.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$credential = PBAPI::get_credential( 'Google Console Client' );\nif ( $credential ) {\n\t$authorization = $credential-&gt;authorization();\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::save_credential<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Creates or updates the credential data in the database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Credential data.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Update result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$result = PBAPI::save_credential( array(\n    'name'          =&gt; 'Airtable Token',\n    'schema'        =&gt; 'Bearer',\n    'access_token'  =&gt; 'abcd123456789',\n) );<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>static PBAPI::delete_credential<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Removes the credential from the database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string<\/code> Credential name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Update result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$result = PBAPI::delete_credential( 'Airtable Token' );\nif ( $result ) {\n    # do something\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"filters\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Filters<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-843c0c0e wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_remote_data<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters the fetched remote data for a Remote CPT before it is used for synchronization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array $remote_data<\/code> Loaded remote data.<\/li>\n\n\n\n<li><code>POSTS_BRIDGE\\Remote_CPT $rcpt<\/code> Remote CPT object.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>mixed|null<\/code> Remote data. If null is returned, post synchronization will be skipped.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_remote_data',\n    function ( $data, $rcpt ) {\n        if ( 'event' === $rcpt-&gt;post_type ) {\n            $data&#91;'tags_input'] = array( 'remote' );\n        }\n\n        return $data;\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_remote_items<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters the list of remote items, or records, loaded from the list endpoint of the bridge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array $items<\/code> Bridge remote items.<\/li>\n\n\n\n<li><code>POSTS_BRIDGE\\Post_Bridge $bridge<\/code> Bridge instance.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Filtered items.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_remote_items',\n    function ( $items, $bridge ) {\n        if ( 'contacts' === $bridge-&gt;name ) {\n            return array_filter(\n                $items,\n                function ( $item_data ) {\n                    return ! empty( $item_data&#91;'email'] );\n                }\n            );\n        }\n\n        return $items;\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_http_backend_headers<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters backend HTTP request headers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array $headers<\/code> Associative array with HTTP headers.<\/li>\n\n\n\n<li><code>Http_Backend $backend<\/code> Backend object.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Filtered HTTP headers.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_http_backend_headers',\n    function ( $headers, $backend ) {\n        $headers&#91;'Accept-Language'] = 'es_ES';\n        return $headers;\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_http_backend_url<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters backend request URLs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string $url<\/code> Synchronization request URL.<\/li>\n\n\n\n<li><code>POSTS_BRIDGE\\Http\\Backend $backend<\/code> Backend object.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Filtered HTTP headers.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_http_backend_url',\n    function ( $url, $backend ) {\n        $url = str_replace( 'http:\/\/', 'https:\/\/', $url );\n        return $url;\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_http_request<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters the backend request params before it is sent. Posts Bridge use the <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_http\/\" target=\"_blank\" rel=\"noopener\">WP_Http<\/a> under the hood. Check out the <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_http\/request\/\" target=\"_blank\" rel=\"noopener\">WP_Http::request<\/a> documentation for more details about the params.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array $params<\/code> HTTP request params.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Filtered HTTP request params.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_http_request',\n    function ( $request ) {\n        $request&#91;'args']&#91;'ssl_verify'] = false;\n        return $request;\n    },\n    10,\n    1,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_skip_synchronization<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Controls if Posts Bridge should skip the post synchronization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean $skip<\/code> False by default, use this filter to skip posts synchronizations.<\/li>\n\n\n\n<li><code>POSTS_BRIDGE\\Remote_CPT $rcpt<\/code> Remote CPT object.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> True value will skip the synchronization of the current Remote CPT.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_skip_synchronization',\n    function ( $skip, $rcpt, $data ) {\n        if ( 'event' === $rcpt-&gt;post_type &amp;&amp; ! $data&#91;'start_date'] ) {\n            return true;\n        }\n\n        return $skip;\n    },\n    10,\n    3,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_introspection_ping<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters the result of a ping introspection request of the REST API add-on (for custom integrations).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean $result<\/code> True if the backend is successfully reached, false otherwise.<\/li>\n\n\n\n<li><code>string $backend<\/code> Backend name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>boolean<\/code> Ping result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_introspection_ping',\n    function ( $result, $backend ) {\n        if ( 'Placeholder' === $backend ) {\n            return true;\n        }\n\n        return $result;\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code><code>posts_bridge_introspection_endpoints<\/code><\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters the response of an endpoints introspection request of the REST API add-on (for custom integrations).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string[] $endpoints<\/code> List of available endpoints.<\/li>\n\n\n\n<li><code>string $backend<\/code> Backend name.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>string[]<\/code> List of available endpoints.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_introspection_endpoints',\n    function ( $endpoints, $backend ) {\n        if ( 'Placeholder' === $backend ) {\n            return array(\n               '\/posts',\n               '\/comments',\n               '\/albums',\n               '\/photos',\n               '\/todos',\n            );\n        }\n\n        return $endpoints;\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code><code>posts_bridge_introspection_schema<\/code><\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Filters the response of endpoint schema introspection request of the REST API add-on (for custom integrations).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array $schema<\/code> List of available endpoints.<\/li>\n\n\n\n<li><code>string $backend<\/code> Backend name.<\/li>\n\n\n\n<li><code>string $endpoint<\/code> Target endpoint.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Return<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>array<\/code> Endpoint fields json schema.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_filter(\n    'posts_bridge_introspection_schema',\n    function ( $schema, $backend, $endpoint ) {\n        if ( 'Placeholder' !== $backend || '\/posts' !== $endpoint ) {\n            return $schema;\n        }\n\n        return array(\n            array(\n                'name' =&gt; 'id',\n                'schema' =&gt; array( 'type' =&gt; 'integer' ),\n            ),\n            array(\n                'name' =&gt; 'userId',\n                'schema' =&gt; array( 'type' =&gt; 'integer' ),\n            ),\n            array(\n                'name' =&gt; 'title',\n                'schema' =&gt; array( 'type' =&gt; 'string' ),\n            ),\n            array(\n                'name' =&gt; 'body',\n                'schema' =&gt; array( 'type' =&gt; 'string' ),\n            ),\n        );\n    },\n    10,\n    3,\n);<\/code><\/pre>\n<\/div>\n<\/div>\n<\/section>\n\n\n\n<section class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"border-top-color:var(--wp--preset--color--light-gray);border-top-style:dashed;border-top-width:2px;margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--80);padding-top:var(--wp--preset--spacing--40)\">\n<div style=\"height:0px\" aria-hidden=\"true\" id=\"actions\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Actions<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-843c0c0e wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_before_synchronization<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Action to do just before a post synchronization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Remote_CPT $rcpt<\/code> Current Remote CPT object.<\/li>\n\n\n\n<li><code>array $post_data<\/code> Post data to be inserted.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_action(\n    'posts_bridge_before_synchronization',\n    function ( $rcpt, $post_data ) {\n        # do something\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\"><code>posts_bridge_after_synchronization<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Action to do just after a post synchronization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arguments<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>POSTS_BRIDGE\\Remote_CPT $rcpt<\/code> Current Remote CPT instance.<\/li>\n\n\n\n<li><code>array $post_data<\/code> Post data inserted.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_action(\n    'posts_bridge_after_synchronization',\n    function ( $rcpt, $post_data ) {\n        # do something\n    },\n    10,\n    2,\n);<\/code><\/pre>\n<\/div>\n<\/div>\n<\/section>\n<\/section>\n<\/div>\n\n\n\n<div style=\"height:0px;width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer is-style-default wp-container-content-abf6deda\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Documentation We are glad to have you here! In our documentation you&#8217;ll find everything you need to work with Posts Bridge. Posts Bridge is a powerful tool to synchronize your WordPress site content with third party systems over HTTP requests. The approach of this plugin is to escape from closed solutions and to bring to [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3928,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-322","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/pages\/322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/comments?post=322"}],"version-history":[{"count":464,"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/pages\/322\/revisions"}],"predecessor-version":[{"id":4077,"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/pages\/322\/revisions\/4077"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/media\/3928"}],"wp:attachment":[{"href":"https:\/\/postsbridge.codeccoop.org\/wp-json\/wp\/v2\/media?parent=322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}