{"id":21,"date":"2026-09-16T10:28:32","date_gmt":"2026-09-16T10:28:32","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/settings\/"},"modified":"2026-09-16T10:28:32","modified_gmt":"2026-09-16T10:28:32","slug":"settings","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/esti-to-wordpress\/settings\/","title":{"rendered":"Settings"},"content":{"rendered":"<h1>Settings reference<\/h1>\n<p>All settings live under <strong>Esti To WordPress \u2192 Settings<\/strong>, split across four tabs. Each tab saves on its own \u2014 pressing <em><br \/>\n<\/em>Save Changes** on one tab never touches the fields of the others.<\/p>\n<p>Everything except the license is stored in a single WordPress option, <code>osfec_settings<\/code>; the license lives in its own<br \/>\n<code>osfec_license_*<\/code> options.<\/p>\n<hr \/>\n<h2>General<\/h2>\n<h3>Company identifier<\/h3>\n<p>Your account identifier in Esti CRM. Without it and the token, no synchronization can run.<\/p>\n<h3>API token<\/h3>\n<p>The API token issued by Esti CRM. It is stored in the database and sent with every request to Esti; it is never shown on<br \/>\nthe front end.<\/p>\n<h3>Archive slug<\/h3>\n<p>The path the offers are published under. Default: <code>offers<\/code>.<\/p>\n<pre><code>Archive slug: offers   \u2192  \/offers\/  and  \/offers\/apartment-warsaw-123\/\nArchive slug: oferty   \u2192  \/oferty\/  and  \/oferty\/apartment-warsaw-123\/<\/code><\/pre>\n<p>Saving a new slug rebuilds the permalinks by itself. <strong>Every existing offer URL changes<\/strong>, so links you have shared and<br \/>\npages already indexed by Google will 404. Pick the slug before launch and leave it alone afterwards.<\/p>\n<h3>Offers per page<\/h3>\n<p>How many offers one page of the archive shows before pagination kicks in. Default: <code>12<\/code>. It is also the default limit<br \/>\nfor the <code>[osfec_offers]<\/code> shortcode and the Offers block when they carry no <code>limit<\/code> of their own.<\/p>\n<hr \/>\n<h2>Import filter<\/h2>\n<p>This tab decides <strong>which offers are imported at all<\/strong>. Everything that does not pass is skipped and never becomes a<br \/>\npost.<\/p>\n<p>Two conditions are always enforced and are not configurable: the offer must be <strong>active<\/strong> in Esti CRM, and its owner<br \/>\nmust have <strong>cleared it for online export<\/strong>.<\/p>\n<p>An empty field means &#8220;no restriction on this criterion&#8221;. All filled criteria must match at the same time.<\/p>\n<h3>Offer types<\/h3>\n<p>A checkbox list of the types found in your catalogue (<code>Apartment<\/code>, <code>House<\/code>, <code>Plot<\/code>, \u2026). Check none to import every type.<\/p>\n<p>The list is built from offers that are already imported, so it is empty before the first synchronization. Run a full<br \/>\nimport once, then come back and narrow it down.<\/p>\n<h3>Offer subtypes<\/h3>\n<p>Esti has no separate subtype field: the variant sits in brackets inside the type name, so <code>Dzia\u0142ka (Rolna)<\/code> yields the<br \/>\nsubtype <code>Rolna<\/code>. This box lists those variants.<\/p>\n<p>Two things worth knowing:<\/p>\n<ul>\n<li>Like the type list, it fills up after the first synchronization.<\/li>\n<li>Once you check any subtype, offers <strong>without<\/strong> a bracketed variant no longer match, so they stop being imported.<\/li>\n<\/ul>\n<h3>Cities<\/h3>\n<p>A comma separated list, for example:<\/p>\n<pre><code>Bia\u0142ystok, Supra\u015bl, Choroszcz<\/code><\/pre>\n<p>Matched against the city name in Esti, ignoring letter case but otherwise exactly \u2014 <code>Bialystok<\/code> without the diacritic<br \/>\nwill not match <code>Bia\u0142ystok<\/code>. Leave empty for all cities.<\/p>\n<h3>Transaction<\/h3>\n<p>Import only sale, rent, purchase or lease offers. Leave on the &#8220;all&#8221; option for no restriction.<\/p>\n<h3>Minimum price \/ Maximum price<\/h3>\n<p>The price range, in the offer&#8217;s own currency as Esti sends it. Offers outside the range are skipped.<\/p>\n<p>Note that an offer whose price is hidden in Esti still carries a price in the payload, and this filter is applied to<br \/>\nthat value even though the site later shows &#8220;Price on request&#8221;.<\/p>\n<h3>What happens when you tighten the filter<\/h3>\n<p>Offers that no longer pass simply stop arriving from the import. On the next successful run they are treated as offers<br \/>\nEsti no longer publishes and their posts are <strong>permanently deleted<\/strong>. Loosening the filter again re-imports them, with<br \/>\nnew post IDs and, for offers whose title changed, possibly new URLs.<\/p>\n<hr \/>\n<h2>Archive filters<\/h2>\n<p>Controls which fields the visitor-facing filter bar shows on the offer archive \u2014 and on any<br \/>\n<code>[osfec_offers filters=\"yes\"]<\/code> shortcode or block.<\/p>\n<table>\n<thead>\n<tr>\n<th>Checkbox<\/th>\n<th>Field the visitor gets<\/th>\n<th>URL parameter<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Property type<\/td>\n<td>Dropdown of the imported types<\/td>\n<td><code>type<\/code><\/td>\n<\/tr>\n<tr>\n<td>Transaction<\/td>\n<td>Sale \/ Rent<\/td>\n<td><code>transaction<\/code><\/td>\n<\/tr>\n<tr>\n<td>Location<\/td>\n<td>Dropdown of the imported cities<\/td>\n<td><code>city<\/code><\/td>\n<\/tr>\n<tr>\n<td>Price<\/td>\n<td>From \/ To pair<\/td>\n<td><code>price_min<\/code>, <code>price_max<\/code><\/td>\n<\/tr>\n<tr>\n<td>Area<\/td>\n<td>From \/ To pair<\/td>\n<td><code>area_min<\/code>, <code>area_max<\/code><\/td>\n<\/tr>\n<tr>\n<td>Rooms<\/td>\n<td>Number field<\/td>\n<td><code>rooms<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Unchecking every box hides the filter bar completely.<\/p>\n<p>Hiding a field only hides the control. The parameter still works if it appears in the URL, which is what makes<br \/>\nhand-built links like <code>\/offers\/?city=bialystok<\/code> keep working on a site whose filter bar shows nothing but price.<\/p>\n<p>Sorting is not part of this setting: the archive always offers its <strong>Sort by<\/strong> dropdown.<\/p>\n<hr \/>\n<h2>License<\/h2>\n<p>Synchronization only runs while a license key is active. Everything else keeps working without one: offers already<br \/>\nimported stay published, the archive, the filters, the shortcode and the block are untouched. Only the import stops.<\/p>\n<h3>Activating a key<\/h3>\n<p>Paste the key issued in your account dashboard into <strong>License key<\/strong> and press <strong>Activate<\/strong>. The key is verified against<br \/>\nthe license server, which answers with the license status, the date it is paid up to and the plugin version it covers.<br \/>\nThe verdict is stored locally and re-checked once a day.<\/p>\n<h3>What the tab shows<\/h3>\n<ul>\n<li><strong>Status<\/strong> \u2014 <em>Active<\/em> or <em>Not active<\/em><\/li>\n<li><strong>Key<\/strong> \u2014 the stored key with its middle masked out<\/li>\n<li><strong>Valid until<\/strong> \u2014 the date the subscription is paid to, marked <em>expired<\/em> once it passes<\/li>\n<li><strong>Covered version<\/strong> \u2014 the newest plugin version the license covers, next to the version installed<\/li>\n<\/ul>\n<p><strong>Remove key<\/strong> deletes the key from this site and stops the synchronization. It does not consume or release anything on<br \/>\nthe license server, so the same key can be activated again.<\/p>\n<h3>Expiry<\/h3>\n<p>An expired subscription does not switch the plugin off. The version the license covered keeps synchronizing, and the<br \/>\nadmin says so; running a <strong>newer<\/strong> version than the covered one is what stops the import until the license is renewed.<br \/>\nSee <a href=\"#updates\">Updates<\/a>.<\/p>\n<p>A license server that cannot be reached \u2014 a timeout, DNS trouble, an outage \u2014 never changes the stored status. Only an<br \/>\nanswer from the server does, so a network problem cannot lock a paying site out of its own catalogue.<\/p>\n<h3>Updates<\/h3>\n<p>The plugin is not distributed through wordpress.org, so it reports its own updates. A newer release shows up on <em><br \/>\n<\/em>Plugins<strong> and under <\/strong>Dashboard \u2192 Updates<strong> like any other plugin update, with the usual <\/strong>Update now** button \u2014 there<br \/>\nis nothing extra to click on the License tab.<\/p>\n<p>Updating is never blocked: the newest release always installs, with or without a license. What the license decides is<br \/>\nwhether that version then <strong>runs<\/strong>. Install a release your expired license does not cover and the plugin keeps its<br \/>\noffers, its archive and its templates, but stops synchronizing and says which version your license covers \u2014 renewing<br \/>\nturns it back on, without reinstalling anything.<\/p>\n<hr \/>\n<h2>The synchronization panel<\/h2>\n<p>Below the tabs, on every tab except <strong>License<\/strong>, the settings screen shows:<\/p>\n<ul>\n<li><strong>Status<\/strong> \u2014 whether a synchronization is running right now, plus a link to the log<\/li>\n<li><strong>Last run<\/strong> \u2014 when the last run finished<\/li>\n<li><strong>Value dictionary<\/strong> \u2014 how many entries were cached from Esti; attributes such as heating or fencing stay hidden until<br \/>\nthe dictionary can name them<\/li>\n<li><strong>Next scheduled run<\/strong><\/li>\n<li><strong>Sync now<\/strong> \u2014 starts a run immediately<\/li>\n<\/ul>\n<p>A red notice appears here when the last run failed, together with a reminder that existing offers were left untouched.<\/p>\n<p>Without an active license the <strong>Sync now<\/strong> button is disabled and the scheduled runs return without fetching anything.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Settings reference All settings live under Esti To WordPress \u2192 Settings, split across four tabs. Each tab saves on its own \u2014 pressing Save Changes** on\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_latwm_translated_slug":"","footnotes":""},"categories":[2],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-esti-to-wordpress"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":1,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":45,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/21\/revisions\/45"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}