# DinOdds: full documentation > Display odds comparison tables for major leagues on your website with just a couple of clicks. ============================================================ DinOdds ============================================================ --- URL: https://docs.affkraft.com/dinodds Markdown: https://docs.affkraft.com/dinodds.md # DinOdds Plugin DinOdds lets you display odds comparison tables for major leagues on your website, in a couple of clicks. Add the **DinOdds Odds** block in the editor, or paste an `[odds]` shortcode anywhere. *** ## Getting Started Follow the documentation to install and set up the plugin, then add your first table. ### Requirements To use the plugin you must be running `WordPress 6.0` or higher and `PHP 8.1` or higher. Your website needs to be able to make outgoing requests to the feed server (see [Troubleshooting](https://docs.affkraft.com/dinodds/troubleshooting)). The [AI & Abilities](https://docs.affkraft.com/dinodds/ai) features need `WordPress 6.9` or higher. The rest of the plugin works on older versions. ### Subscription To use the plugin you need a monthly or yearly DinOdds subscription. Which leagues and sportsbooks your site gets is set in your AffKraft account. Read more [here](https://docs.affkraft.com/dinodds/api). ### What's in the plugin * [Installation](https://docs.affkraft.com/dinodds/installation) and [setup](https://docs.affkraft.com/dinodds/plugin-setup) with your Client ID * The [Odds Table block](https://docs.affkraft.com/dinodds/blocks) and the [`[odds]` shortcode](https://docs.affkraft.com/dinodds/plugin-shortcodes) * [Plugin settings](https://docs.affkraft.com/dinodds/plugin-settings): overview, sportsbooks, display defaults, shortcode generator and AI & Abilities * [Feed updates](https://docs.affkraft.com/dinodds/feed-updates) and [scheduling](https://docs.affkraft.com/dinodds/scheduling) * [AI & Abilities](https://docs.affkraft.com/dinodds/ai): manage odds tables from an AI chat * The public [REST endpoint](https://docs.affkraft.com/dinodds/rest-api) the tables load their odds from * [Troubleshooting](https://docs.affkraft.com/dinodds/troubleshooting) ### Changelog Find the full changelog [here](https://affkraft.com/changelog?product=dinodds). --- URL: https://docs.affkraft.com/dinodds/api Markdown: https://docs.affkraft.com/dinodds/api.md # DinoFeeds API By purchasing any DinOdds package, you get access to the DinoFeeds API. ### About the API DinoFeeds API has been developed to provide an easy solution for displaying betting odds feeds on WordPress websites, specifically through the DinOdds plugin. The plugin pulls the odds from the feed once an hour and saves them on your website. Your visitors never contact the feed: their browsers load the odds from your own website's [REST endpoint](https://docs.affkraft.com/dinodds/rest-api). ### API Settings You can control the API settings through your [AffKraft account](https://affkraft.com/account). Find the DinOdds subscription you need and open its settings, where you can adjust: * the **leagues** and **sportsbooks** you want to receive * the website (domain and IP) that is allowed to fetch odds #### Available leagues | Sport | Leagues (slug) | | ----------------- | ------------------------------------------- | | American football | NFL (`nfl`), NCAAF (`ncaaf`), CFL (`cfl`) | | Basketball | NBA (`nba`), NCAAB (`ncaab`), WNBA (`wnba`) | | Baseball | MLB (`mlb`) | | Hockey | NHL (`nhl`) | | Combat sports | Boxing (`boxing`), UFC (`ufc`) | | Tennis | ATP (`atp`), WTA (`wta`) | Use the slug in the `[odds]` shortcode, for example `[odds league="atp"]`. #### Notes: 1. You can always change the settings for your subscription 2. You can select to pull data for only the leagues and the sportsbooks you want 3. If a league is out of season, or you don't promote a sportsbook, it's recommended to skip them, otherwise, you'll have additional **unused** data stored in your database 4. The plugin doesn't choose sportsbooks, the account does. After a change, save your Client ID again in the plugin (sidebar → **Change**) to load the new list, see [Feed Updates](https://docs.affkraft.com/dinodds/feed-updates#changing-leagues-or-sportsbooks) 5. If you move the site to another domain or server, update the allowed website here too, otherwise feed requests are refused --- URL: https://docs.affkraft.com/dinodds/installation Markdown: https://docs.affkraft.com/dinodds/installation.md # Plugin Installation You can install the plugin either through the WordPress dashboard (recommended) or via FTP. *** ## Before Installation Please make sure your server meets the minimum [system requirements](https://docs.affkraft.com/dinodds#requirements) and download the plugin file from your [AffKraft account](https://affkraft.com/account). ### Install through WordPress Dashboard 1. Visit WordPress dashboard → Plugins and click `Add New` and `Upload Plugin` after that 2. Click `Choose File`, select the plugin file `dinodds.zip` and click `Install Now` 3. Activate the plugin ### Install via FTP 1. Log in to your server with your FTP credentials, using an FTP client, cPanel or similar 2. Navigate to `plugins` directory from your WordPress website root 3. Upload the plugin file `dinodds.zip` to `plugins` directory 4. Unzip the archive, you'll have a directory `dinodds` in plugins 5. Remove the `dinodds.zip` file 6. Visit WordPress dashboard → Plugins and activate the plugin ### Next step After activating, [set up the plugin](https://docs.affkraft.com/dinodds/plugin-setup) with your Client ID. --- URL: https://docs.affkraft.com/dinodds/plugin-setup Markdown: https://docs.affkraft.com/dinodds/plugin-setup.md # Plugin Setup You need to connect the plugin to your subscription before you can use it. ## Client ID Your DinOdds Client ID is the license key you get when purchasing a subscription. You can get it from your [AffKraft account](https://affkraft.com/account). ## First-run setup After activating DinOdds, you'll find a new menu item in your WordPress dashboard left-hand navigation: **DinOdds**. Visit it, or use the **Settings** link in your plugins list. Until a Client ID is saved, the page shows a three-step setup: 1. **Connect.** Enter your Client ID and click **Connect**. The plugin loads your leagues, sportsbooks and the first odds, and schedules the hourly [feed update](https://docs.affkraft.com/dinodds/feed-updates). 2. **Sportsbooks.** Add your affiliate link for each sportsbook. You can skip this and do it later on the [Sportsbooks tab](https://docs.affkraft.com/dinodds/affiliate-settings). 3. **Add your first table.** Copy the ready-made `[odds league="..."]` shortcode, or click **Create a draft and open it** to get a new draft post that already contains the [Odds Table block](https://docs.affkraft.com/dinodds/blocks). After that, the page opens on the [Overview tab](https://docs.affkraft.com/dinodds/plugin-settings). ## Change or remove the Client ID The sidebar of the settings page shows your Client ID, partly hidden. Click **Change** to enter a new one, or **Remove** to disconnect the plugin; removing it also stops the scheduled feed updates. ## If connecting fails If you get an error that the license key is not correct, or the connection fails: * make sure there are no white spaces in the beginning or at the end of the key * if you have a firewall installed on your server, make sure outgoing requests to the feed server are not being blocked (see [Troubleshooting](https://docs.affkraft.com/dinodds/troubleshooting)) * make sure your subscription is active and your site is allowed in your account settings (see [DinoFeeds API](https://docs.affkraft.com/dinodds/api)) --- URL: https://docs.affkraft.com/dinodds/plugin-settings Markdown: https://docs.affkraft.com/dinodds/plugin-settings.md # Plugin Settings Open the settings by visiting the **DinOdds** link in your WordPress dashboard left-hand navigation. Only users who can manage options (Administrators) see it. The settings are split into five tabs, and the sidebar shows the plugin version, useful links and your Client ID. ## Overview The Overview tab shows how the plugin is doing: * **Feed status.** A status light and a line such as "Updated 5 minutes ago, next update in 55 minutes". The states are *up to date*, *out of date* (no successful update for more than two hours), *the last update failed* (with the last error) and *not loaded yet*. * **Update now.** Fetches fresh odds immediately and refreshes the status without reloading the page. Feeds already update every hour, so you rarely need it; it works at most once every 5 minutes, and if you click too soon it says how long to wait. See [Feed updates](https://docs.affkraft.com/dinodds/feed-updates). * **Stat tiles.** The number of leagues, the number of upcoming matches, and how many sportsbooks have an affiliate link. * **Leagues.** A chip for each league with its number of upcoming matches. Leagues with no upcoming matches are dimmed. * **Used on.** Posts and pages that contain an `[odds]` shortcode or the Odds Table block (up to 20, most recently modified first; the list is cached and refreshes when you save a post). Click a title to edit it. * **Warnings.** A notice appears if the last update failed or feeds are out of date, if some sportsbooks have no affiliate link, or if a league has no upcoming matches right now. ## Sportsbooks Set affiliate links, logos and link behaviour, and the order of the sportsbooks. See [Sportsbooks](https://docs.affkraft.com/dinodds/affiliate-settings). ## Display Site-wide defaults for every table, and the highlight colour. See [Display settings and colors](https://docs.affkraft.com/dinodds/colors). ## Shortcode A generator with a live preview and a match picker. See [Shortcodes](https://docs.affkraft.com/dinodds/plugin-shortcodes#shortcode-generator). ## AI & Abilities Let an AI assistant such as Claude or ChatGPT read your odds data and build odds tables. See [AI & Abilities](https://docs.affkraft.com/dinodds/ai). ## Sidebar: Client ID The sidebar shows your Client ID with its middle hidden. **Change** lets you enter a new Client ID and **Remove** disconnects the plugin. See [Plugin Setup](https://docs.affkraft.com/dinodds/plugin-setup). --- URL: https://docs.affkraft.com/dinodds/blocks Markdown: https://docs.affkraft.com/dinodds/blocks.md # Odds Table Block `💁 since version 1.7` DinOdds adds an **Odds Table** block (`dinodds/odds`, shown in the editor as **DinOdds Odds**) to the block editor. It shows the same table as the [`[odds]` shortcode](https://docs.affkraft.com/dinodds/plugin-shortcodes), with a settings sidebar and a live preview, so you don't need to write attributes by hand. ## Insert the block 1. Edit a post or page and click the **+** inserter (or type `/odds` on an empty line). 2. Search for **DinOdds Odds**. It is in the **Widgets** category. 3. Choose a league in the block's sidebar settings. Until you do, the block shows a placeholder asking you to choose one. You can also let DinOdds create a draft post with the block already in it during the [first-run setup](https://docs.affkraft.com/dinodds/plugin-setup). ## Block settings Select the block and open the sidebar (the settings icon in the top right). The settings are in two panels. ### Odds table panel | Setting | What it does | | --- | --- | | **League** | The league whose odds you want to show. Required. Changing the league clears the selected match. | | **Match** | Choose **All matches** (default) or one upcoming game of the selected league, listed as `Away @ Home (date)`. Disabled until a league is chosen. | | **Style** | **Style 1** or **Style 2**. See [Shortcode styles](https://docs.affkraft.com/dinodds/plugin-shortcodes#shortcode-styles). | | **Layout** | **Top** or **Inline**: where the sportsbook links appear. Hidden when Style 2 is selected, because Style 2 has no layout option. | | **Odds type** | The odds type shown first: **Spread**, **Moneyline** or **Total**. | | **Show type selector** | Whether visitors can switch between the odds types. | ### Bookies panel A checkbox for each sportsbook in your feed, in the saved order from the [Sportsbooks tab](https://docs.affkraft.com/dinodds/affiliate-settings); tables show the selected sportsbooks in that order too. Leave all of them unchecked to show every sportsbook. ### Defaults Settings you don't change in the block follow the site-wide defaults from the [Display tab](https://docs.affkraft.com/dinodds/colors). The sidebar shows the current default value. Once you change a setting in the block, that table keeps its own value even if the defaults change later. ## Live preview Once a league is chosen, the block shows the real table in the editor, using your cached odds, and updates it shortly after each change. The preview is read-only: you can't click inside it. The front-end script isn't loaded in the editor, so the arrows and the type selector only work on the live page. ## Alignment and CSS class * **Alignment.** The block supports **Wide** and **Full width** alignment, if your theme supports them. * **Additional CSS class(es).** Open the **Advanced** section of the sidebar to add your own class. It is added to the block's wrapper element around the table. The first class you enter is also added to the table itself as `df-odds--{class}`, the same as the shortcode's `class` attribute, so you can target either. ## Convert an existing shortcode If a post already has an `[odds]` shortcode in a **Shortcode** block, select that block and use the block toolbar's transform button to change it to **DinOdds Odds**. The league, sportsbooks, style, layout, type, selector, away and home values are carried over, and the shortcode's `class` becomes the block's Additional CSS class. Only a Shortcode block whose text starts with `[odds` offers this. Existing shortcodes keep working, there's no need to convert them. ## Notes * The block is rendered on the server as a placeholder, and the visitor's browser loads the odds. See [REST endpoint](https://docs.affkraft.com/dinodds/rest-api) and [caching](https://docs.affkraft.com/dinodds/troubleshooting#caching). * Which posts use a block or shortcode is listed in the **Used on** section of the [Overview tab](https://docs.affkraft.com/dinodds/plugin-settings#overview). * AI assistants can also insert and edit the block in draft posts: see [AI & Abilities](https://docs.affkraft.com/dinodds/ai). --- URL: https://docs.affkraft.com/dinodds/plugin-shortcodes Markdown: https://docs.affkraft.com/dinodds/plugin-shortcodes.md # Plugin Shortcodes DinOdds lets you display betting odds tables anywhere on your site using a simple `[odds]` shortcode. You can generate these shortcodes from the admin interface and paste them into posts, pages, or widgets. In the block editor you can use the [Odds Table block](https://docs.affkraft.com/dinodds/blocks) instead; both show the same table. ## Shortcode Overview The base shortcode format is: ```text [odds league="" bookies="" style="" layout="" class="" type="" selector="" away="" home=""] ``` You must choose a **league**; without one nothing is shown. All other attributes are optional. `💁 since version 1.7` any attribute you leave out falls back to the site-wide defaults from the [Display tab](https://docs.affkraft.com/dinodds/colors) (style, layout, type and selector), and to all sportsbooks when `bookies` is empty. ## Shortcode Types `💁 since version 1.3` there are two main ways to display odds: * **All League Odds** Display an odds table for all *upcoming* matches in a given league. * **Single Match Odds** Display odds for a single match in that league by specifying both `away` and `home` team names. If **both** `away` and `home` are provided, DinOdds will attempt to find and display that single upcoming match. If either is missing, DinOdds falls back to the **All League Odds** view. Matches that have already started are not shown. ### Shortcode Styles `💁 since version 1.5` there are two styles you can use for displaying odds: * **Style 1**: Navigate left and right using arrows * **Style 2**: Navigate left and right using the mouse and/or keyboard Style 2 has no layout option (`layout` is ignored), and no separate single-match view: a single match with Style 2 is shown as a one-row table. ### Examples * All league odds (default style and layout): ```text [odds league="nfl"] ``` * All league odds with selected bookies, style 2, without odds type selector: ```text [odds league="nfl" bookies="mybookie,betonline" style="2" selector="false"] ``` * Single match odds for a specific game: ```text [odds league="nfl" away="Buffalo Bills" home="Houston Texans"] ``` ## Shortcode Generator You don't need to write attributes by hand. Open the **Shortcode** tab in the DinOdds settings: 1. **League**: choose a league from the dropdown. Required. 2. **Match**: leave on **All matches**, or pick one upcoming game. The list loads when you choose a league and fills in `away` and `home` for you. 3. **Sportsbooks**: tick the sportsbooks to show. Leave all unticked to show every sportsbook. 4. **Style**: **Default** (your Display tab value), **Style 1** or **Style 2**. 5. **Links layout**: **Default**, **Top** or **Inline**. Hidden when Style 2 is chosen. 6. **Odds type**: **Default**, **Spread**, **Moneyline** or **Total**. 7. **Type selector**: **Default**, **Show** or **Hide**. 8. **CSS class**: an optional extra class you can target in your theme styles. The shortcode and a live preview of the table update as you change the options. Settings left on **Default** are not added to the shortcode, so the table follows the Display tab. Click **Copy shortcode** and paste it wherever you want the table to appear. ## Shortcode Attributes | Attribute | Required | Description | Default | | ---------- | -------- | ------------------------------------------------------------------------------------------------------------ | --------------------------------- | | `league` | Yes | League identifier whose odds you want to display, e.g. `nfl`. | — | | `bookies` | No | Comma-separated list of sportsbook slugs, e.g. `mybookie,betonline`. Only sportsbooks in your feed are used; names are not case-sensitive. | All sportsbooks, in saved order | | `style` | No | Table style: `1` or `2`. | Display tab (`1`) | | `layout` | No | Where sportsbook links appear: `top` or `inline`. Ignored by style 2. | Display tab (`top`) | | `type` | No | Odds type shown first: `spread`, `moneyline` or `total`. | Display tab (`spread`) | | `selector` | No | Whether to display the odds type selector: `true` or `false`. | Display tab (`true`) | | `class` | No | Extra CSS class added to the table as `df-odds--{class}`. | — | | `away` | No | Away team name for a single match. Needs `home` too. | — | | `home` | No | Home team name for a single match. Needs `away` too. | — | Team names must match the names in the feed exactly; use the generator's **Match** list to get them right. A value that isn't allowed (for example `style="3"`) is ignored and the Display tab value is used. When there are **no upcoming matches** for the chosen league (or no matching single game for the given teams), DinOdds displays a "no matches available" view instead of leaving the page blank. ## How the odds are loaded The shortcode outputs only an empty table with a loading animation. The visitor's browser then loads the odds from the [REST endpoint](https://docs.affkraft.com/dinodds/rest-api). Because no odds are saved in the page itself, page caches can't serve stale odds. Visitors need JavaScript enabled to see the odds. --- URL: https://docs.affkraft.com/dinodds/affiliate-settings Markdown: https://docs.affkraft.com/dinodds/affiliate-settings.md # Sportsbooks The **Sportsbooks** tab in the DinOdds settings is where you add your affiliate links, change logos and set how links behave, so the tables fit your site. > **Tip** > > Which sportsbooks (and leagues) your site receives is chosen in your [AffKraft account](https://affkraft.com/account), under your DinOdds subscription, not in the plugin. See [DinoFeeds API](https://docs.affkraft.com/dinodds/api). After you change it there, open the sidebar of the DinOdds settings, click **Change** next to the Client ID and save the same Client ID again to load the new list of leagues and sportsbooks. Sportsbooks are listed with their proper names, such as ApuestaHoy, BetUS or MyBookie, a logo preview, and a badge showing whether an affiliate link is **Added** or **Missing**. ## Edit a sportsbook Click **Edit** on a row to open its settings: * **Affiliate link.** Where the sportsbook's logo and odds link to. It must start with `http://` or `https://`; otherwise saving fails with a message naming the sportsbook. **Test link** opens the link so you can check it. * **Logo.** A URL, or **Choose from library** to pick an image from the WordPress media library. **Reset to default logo** goes back to the logo that comes with the plugin. * **Open in new tab.** Adds `target="_blank"` to the link. * **Sponsored link.** Adds `rel="sponsored"`. Most affiliate links should have it. * **Advanced: extra rel values.** Any other `rel` values, such as `nofollow noopener`. Saving applies to that sportsbook only. A sportsbook without its own link behaviour uses the plugin defaults (same tab, `nofollow noopener noreferrer`). ## Order Drag a row by its handle to change the order the sportsbooks appear in the tables. The order saves automatically. It is used when a table shows all sportsbooks, and for the order of choices in the block and generator. ## Missing links The [Overview tab](https://docs.affkraft.com/dinodds/plugin-settings#overview) counts the sportsbooks with a link and warns about those without one. --- URL: https://docs.affkraft.com/dinodds/feed-updates Markdown: https://docs.affkraft.com/dinodds/feed-updates.md # Feed Updates Feeds are updated automatically every hour. The update is scheduled when you connect the plugin with your Client ID, and runs through WP-Cron. Read more about scheduling [here](https://docs.affkraft.com/dinodds/scheduling). ### Feed status The **Overview** tab of the DinOdds settings shows the state of your feeds, when they were last updated and when the next update is due: * **Feeds are up to date**: the last update worked. * **Feeds are out of date**: no successful update for more than two hours. Usually WP-Cron isn't running, see [Scheduling](https://docs.affkraft.com/dinodds/scheduling). * **The last update failed**: the message shows the reason, for example that your site can't reach the feed server or that access was refused for your Client ID or plan. * **Feeds have not been loaded yet**: connect the plugin first, see [Plugin Setup](https://docs.affkraft.com/dinodds/plugin-setup). The tables on your site show whatever was loaded last, so a failed update means older odds, not an empty table. ### Manually Update Feeds Generally, feeds update every hour, so in most cases there's no need to update them manually. If you need to, click **Update now** on the Overview tab. The feeds are fetched, the status is refreshed and you see a message with the number of leagues updated. **Update now** works at most once every 5 minutes (the limit is shared with the AI `refresh-feed` ability); if you click too soon, the message tells you how long to wait. ### Changing leagues or sportsbooks The leagues and sportsbooks you receive are chosen in your [AffKraft account](https://affkraft.com/account) (see [DinoFeeds API](https://docs.affkraft.com/dinodds/api)). The hourly update refreshes the odds of your leagues, but it doesn't reload the list itself. After changing your selection, click **Change** next to the Client ID in the settings sidebar and save the same Client ID again. --- URL: https://docs.affkraft.com/dinodds/scheduling Markdown: https://docs.affkraft.com/dinodds/scheduling.md # Scheduling Find out how the feed updates work and how to set up cron jobs. ## About scheduling In order to display the latest odds feeds, your website needs to pull the data from DinoFeeds API periodically. The DinOdds plugin does this automatically, once an hour, using WP-Cron. However, there are some caveats we'll discuss below. You can see the last and the next update on the **Overview** tab of the [plugin settings](https://docs.affkraft.com/dinodds/plugin-settings#overview). WP-Cron also runs the plugin's [automatic updates](https://docs.affkraft.com/dinodds/plugin-updates). But before that, let's define cron and cron jobs: > **Cron** is used to schedule commands or scripts (tasks) on Linux servers at a specified time and date. > A **cron job** is the task itself. For example, I can use cron to schedule a database backup on my server every day at 8:00AM - this would be a cron job. Another example could be deleting temporary files, etc. ### WordPress Cron Jobs WordPress has its own "cron system" called WP-Cron: > WP-Cron is how WordPress handles scheduling time-based tasks in WordPress. Several WordPress core features, such as checking for updates and publishing scheduled post, utilize WP-Cron. It is a workaround developed by WordPress and it has some very useful features, however it is run on every page load and **only when a page load occurs**. This is the main issue that we're concerned about now. This means that WP-Cron won't run if there's no page load. For example, if your plugin has a scheduled feeds update task at 3:00PM and there's no page load until 3:40PM, feeds won't be updated by then. First of all, I wouldn't like to rely on a page visit to update my feeds, also it may take a while and delay the page load. There might be other issues as well. Ok, to solve this, we need to: 1. disable WP-Cron 2. use system cron jobs to periodically call WP-Cron This ensures that no matter what WP-Cron will be called periodically and WP scheduled tasks will run on time. One of those tasks is updating the feeds. ### Disable WP-Cron To do this, open your `wp-config.php` file (it is in your website's root directory), add the following line and save it. And we're done here, WP-Cron is disabled. ```php **Warning** > > AI abilities need WordPress 6.9 or newer. On older versions the > **AI & Abilities** tab shows a notice; update WordPress to use them. The rest of > DinOdds works on WordPress 6.0 and newer. > > Your website must also be online and use HTTPS, because the chat app connects > to it over the internet. A local website, or a staging website behind a > password, won't work. ### Set it up 1. **Install the plugins.** Go to **DinOdds → AI & Abilities**. The **Requirements** box at the top shows whether WordPress 6.9, MCP Adapter and the chat app sign-in are ready, with the MCP endpoint address once MCP Adapter is active. 2. **Choose what the assistant can do.** On the same tab, tick **Enable abilities**, then tick the groups you want and click **Save changes**. The default groups let the assistant read odds data, build and insert odds blocks in drafts and change the display defaults, but not touch your affiliate links or refresh the feed. 3. **Turn on sign-in.** Go to **Settings → WP Abilities**, open the **Connection** tab and turn on the OAuth connector. 4. **Connect your chat app.** In your chat app, add a *custom connector* and paste your website address. You'll be sent to your WordPress login page: sign in and approve. 5. **Try it.** Start a new chat, make sure the connector is switched on for it, and ask "list my leagues". Where to add a custom connector depends on the app. Menu names change often, so treat these as a guide: | App | Where | | --- | --- | | Claude | **Settings → Connectors → Add custom connector** | | ChatGPT | Turn on Developer Mode in **Settings → Apps & Connectors → Advanced settings**, then create a connector with your website address and OAuth sign-in. Paid plans only, at the time of writing. | > **Tip** > > "Enable Abilities for MCP" also comes with its own abilities for posts, pages, > media and more. DinOdds doesn't need them, so turn on only the ones you want on > its **Abilities** tab. ### The AI & Abilities tab **Requirements** tells you whether everything is ready. A green mark means that part is fine; otherwise you see what's missing, usually with a button or link to fix it. * **MCP Adapter** and **Chat app sign-in (OAuth)** show whether the two plugins are active. * **DinOdds abilities** shows how many abilities are currently offered, and from how many groups. It reads *Off* while the main switch is off. * Abilities that "Enable Abilities for MCP" has switched off on its own screen are marked as turned off there. Turn them back on there if you want to use them. **Ability groups** starts with the main switch, **Enable abilities**. It is off by default, and while it's off, DinOdds registers nothing, whatever the groups below say. Below it, related abilities are grouped together, each with a description, who can use it and whether it is on by default. **Individual abilities (advanced)** lets you switch off a single ability inside a group you turned on. For example, you can let the assistant read odds data but not insert blocks into drafts. ### Ability groups "Who can use it" means which WordPress users the assistant can sign in as to use that group. | Group | What it can do | Abilities | Who can use it | Default | | --- | --- | --- | --- | --- | | Odds data (read) | List leagues, sportsbooks and upcoming games, read cached odds and check the feed status | `dinodds/list-leagues`, `dinodds/list-bookies`, `dinodds/list-games`, `dinodds/get-odds`, `dinodds/get-feed-status` | Users who can edit posts (Author and up) | On | | Content (drafts only) | Build odds blocks, insert them into draft posts, find where odds are used and change the settings of an odds block or shortcode | `dinodds/build-odds-block`, `dinodds/insert-odds-block`, `dinodds/find-odds-usage`, `dinodds/update-odds-block` | Users who can edit the specific post (new drafts need permission to edit posts) | On | | Display settings | Read and change the site-wide display defaults | `dinodds/get-display-settings`, `dinodds/update-display-settings` | Administrators | On | | Sportsbooks (affiliate links) | Read and change sportsbook logos, affiliate links and link behaviour, and reorder them | `dinodds/get-sportsbooks`, `dinodds/update-sportsbook`, `dinodds/reorder-sportsbooks` | Administrators | Off | | Feed refresh | Fetch fresh odds from the feed now | `dinodds/refresh-feed` | Administrators | Off | ### The 15 abilities | Ability | What it does | | --- | --- | | `dinodds/list-leagues` | Lists the leagues in your feed with the number of upcoming matches in each. | | `dinodds/list-bookies` | Lists the sportsbooks in display order, with name and whether an affiliate link is set. The link itself is only included for administrators when the Sportsbooks group is on. | | `dinodds/list-games` | Lists the upcoming games of a league (teams, date and time in US Eastern). | | `dinodds/get-odds` | Returns the cached prices of a league's upcoming games per sportsbook, optionally for one game and one odds type. For reading and analysis only. | | `dinodds/get-feed-status` | Returns the feed status, when it was last and will next be updated, the last error and matches per league. | | `dinodds/build-odds-block` | Checks table settings (league, teams, sportsbooks) and returns the block markup and the equivalent `[odds]` shortcode. Changes nothing. | | `dinodds/insert-odds-block` | Inserts an odds block (or shortcode) into a draft or pending post, or creates a new draft. | | `dinodds/find-odds-usage` | Lists up to 20 posts and pages that contain an odds block or shortcode, with each one's settings. Only posts the user can edit are listed. | | `dinodds/update-odds-block` | Changes the settings of an odds block or shortcode in a draft or pending post. Settings it doesn't manage, such as alignment and the CSS class, are kept, and it also works when the game has already started. | | `dinodds/get-display-settings` | Returns the site-wide display defaults. | | `dinodds/update-display-settings` | Changes the site-wide display defaults. Only the fields you send change. | | `dinodds/get-sportsbooks` | Returns every sportsbook with its logo, affiliate link and link behaviour. | | `dinodds/update-sportsbook` | Changes one sportsbook's logo, affiliate link, link target, sponsored flag and rel. | | `dinodds/reorder-sportsbooks` | Sets the order the sportsbooks are shown in. | | `dinodds/refresh-feed` | Fetches fresh odds now, the same update that runs hourly. | ### Keeping it safe * **Use a separate WordPress user** for the assistant, with the Editor role, instead of your own Administrator account. Administrator-only groups (display, sportsbooks, feed) then won't work for it, which is a good default. * **Start with the default groups** and turn on more only when you need them. The main switch is off until you turn it on, and an update never turns it on for you. * **Drafts only.** New odds blocks go into drafts or pending posts. Published, scheduled and private posts are never changed by an ability, so you still review and publish yourself. * **Nothing is deleted.** There are no abilities that delete anything. * **Odds stay live.** Assistants are told to insert the block or shortcode, not to paste prices, so the table updates itself as the odds change. * **Your Client ID stays private.** No ability returns your Client ID, license or update information, or the raw feed response. * **Affiliate links are sensitive.** They decide where visitors go and who earns the commission, which is why the Sportsbooks group is off by default. Turn it on only when you want an assistant to manage them, and check what it changed. * **Refreshing is rate-limited.** The feed can be refreshed by an assistant once every 5 minutes at most, and the limit is shared with **Update now** on the Overview tab. * **Ask to see changes first**, especially for bulk edits: "show me the changes before saving". ### Things you can ask * "Which leagues have upcoming games right now?" * "What are the NFL games this week, and which sportsbooks have a spread for Buffalo Bills at Houston Texans?" * "Add the NFL odds table to a new draft called Week 9 picks." * "Add a single-match odds table for Buffalo Bills at Houston Texans after the heading Game preview in the draft *post name*." * "Where do I use odds tables? Which of them use style 2?" * "Change the odds table in the draft *post name* to show only MyBookie and BetOnline." * "Switch my default odds type to moneyline." * "Is my feed up to date?" If the Sportsbooks group is on: * "Which sportsbooks don't have an affiliate link yet?" * "Move BetUS to the top of the list." *** ## Coding agents and developer tools Tools such as Claude Code, Codex or Cursor don't need the chat-app sign-in, so "Enable Abilities for MCP" isn't required. You still turn on the abilities in **DinOdds → AI & Abilities**. ### MCP over HTTP Needs the "MCP Adapter" plugin and a WordPress [Application Password](https://developer.wordpress.org/advanced-administration/security/application-passwords/) (**Users → Profile**). The `@automattic/mcp-wordpress-remote` proxy connects to the endpoint. For Claude Code: ```bash claude mcp add wordpress \ --env WP_API_URL=https://example.com/wp-json/mcp/mcp-adapter-default-server \ --env WP_API_USERNAME=your-user \ --env WP_API_PASSWORD="xxxx xxxx xxxx xxxx xxxx xxxx" \ -- npx -y @automattic/mcp-wordpress-remote@latest ``` ### MCP over WP-CLI On a local site, or over SSH, you can skip HTTP and run the MCP server through WP-CLI (STDIO): ```bash wp mcp-adapter list wp mcp-adapter serve --server=mcp-adapter-default-server --user=admin ``` ### WordPress REST API Abilities with REST enabled are also listed by WordPress itself at `/wp-json/wp-abilities/v1/abilities`. DinOdds' abilities are in the `dinodds` category. This is separate from the public odds [REST endpoint](https://docs.affkraft.com/dinodds/rest-api). *** ## AI writing helpers in the editor The official WordPress AI plugin adds writing helpers inside the Block Editor, such as titles, excerpts and alt text. It works alongside DinOdds and is a different thing from managing your website from a chat assistant. --- URL: https://docs.affkraft.com/dinodds/plugin-updates Markdown: https://docs.affkraft.com/dinodds/plugin-updates.md # DinOdds Plugin Updates DinOdds updates are built into the plugin, meaning you will receive them in your WordPress dashboard as soon as they are available and you don't have to do anything more than click the update button. There's no need to download the plugin and upload it through FTP again. ### Automatic updates `💁 since version 1.7` DinOdds can be updated automatically. In WordPress dashboard → Plugins, the toggle is always available (not only when an update is pending). Click **Enable auto-updates** next to DinOdds. WordPress then installs new versions in the background through WP-Cron, so [WP-Cron has to be running](https://docs.affkraft.com/dinodds/scheduling) on your site. Before 1.7 the plugin's updater wasn't available during background updates, so auto-updates didn't work. ### Manual updates If for some reason you want to update by hand, download the plugin files from your [AffKraft account](https://affkraft.com/account), remove the old plugin directory and upload the new one to your server. Your settings are kept. --- URL: https://docs.affkraft.com/dinodds/troubleshooting Markdown: https://docs.affkraft.com/dinodds/troubleshooting.md # Troubleshooting Start with the **Overview** tab of the [plugin settings](https://docs.affkraft.com/dinodds/plugin-settings#overview): it shows the feed status, the last error, the number of upcoming matches per league and warnings about problems it can see. ## The table shows a loading animation forever, or "Odds could not be loaded" The page only holds an empty table; the visitor's browser loads the odds from your website's [REST endpoint](https://docs.affkraft.com/dinodds/rest-api). If that request fails, the script tries the older `admin-ajax.php` route, and shows the error only if that fails too. 1. Open `https://your-site.com/wp-json/dinodds/v1/odds?league=nfl` (use one of your leagues) in a browser. You should see JSON. If you see an error page, a login prompt or a block page, something is stopping the request. 2. Security and firewall plugins, hosting firewalls and some CDN rules block or restrict the WordPress REST API for logged-out visitors. Allow requests to `/wp-json/dinodds/v1/` (and `admin-ajax.php`) for everyone. Plugins that "disable the REST API for visitors" will break DinOdds tables. 3. Check the browser console for JavaScript errors. Scripts broken by a "minify/combine/delay JavaScript" optimization are a common cause: exclude the DinOdds script from it. 4. Visitors need JavaScript enabled to see the odds. ## Nothing is shown at all * The shortcode needs a `league`. Without one, nothing is output. Check the spelling of the shortcode, and that it's in a place where WordPress runs shortcodes (post content, a Shortcode block, a text widget). * If you use the block, make sure a league is chosen in the block settings. * A theme or page builder that doesn't run shortcodes or render dynamic blocks in that location will not show it. Try the post content first. ## The table says no matches are available * **The league isn't in your feed.** The league slug must be one of those listed on the Overview tab. Choose leagues in your [AffKraft account](https://affkraft.com/account), then save your Client ID again in the plugin sidebar. * **No upcoming games.** A league that is out of season has none (it's dimmed and flagged on the Overview tab). Games that have already started are not shown. Game times are US Eastern. * **Single match not found.** `away` and `home` must both be given and match the team names in the feed exactly. Use the **Match** list in the [shortcode generator](https://docs.affkraft.com/dinodds/plugin-shortcodes#shortcode-generator) or the block to pick the game. Once the game starts it disappears, and the table says no matches are available. ## A sportsbook is missing, or has no link * Only sportsbooks in your feed are shown. Sportsbooks are chosen in your [AffKraft account](https://affkraft.com/account). After changing the selection, click **Change** next to the Client ID in the plugin sidebar and save the same Client ID. * A sportsbook listed in `bookies` that isn't in your feed is ignored. * Sportsbooks without an affiliate link are flagged **Missing** on the [Sportsbooks tab](https://docs.affkraft.com/dinodds/affiliate-settings). ## Odds look outdated, or the feed status is red * Open the Overview tab. **The last update failed** shows the reason. **Feeds are out of date** means no successful update for over two hours. * Updates run through WP-Cron. If your site gets little traffic or `DISABLE_WP_CRON` is on without a system cron job, they don't run. See [Scheduling](https://docs.affkraft.com/dinodds/scheduling). * Make sure your server can make outgoing requests to the feed server (`feeds.dinomatic.com`) and, for plugin updates, to `api.affkraft.com`. Some firewalls block them. * An expired subscription, or a website (domain or IP) that isn't allowed in your account, gets access refused. Check your settings in your [AffKraft account](https://affkraft.com/account) and see [DinoFeeds API](https://docs.affkraft.com/dinodds/api). * Click **Update now** to try again right away. It works at most once every 5 minutes; if you click too soon, the message says how long to wait. * If updates stopped after deactivating the plugin, reactivate it. The hourly update is scheduled again on activation (and restored automatically when a Client ID is set). ## The Client ID is rejected Make sure there are no spaces before or after the key, your subscription is active, and your server can reach the feed server. See [Plugin Setup](https://docs.affkraft.com/dinodds/plugin-setup). ## Caching Page caching is safe with DinOdds. The page contains no odds, only a placeholder, and the browser loads the odds from the REST endpoint. A caching plugin, host cache or CDN can cache the page for as long as you like without showing stale odds. The REST response is cached until the next scheduled feed update (at least 60 seconds, at most one hour), through its `Cache-Control` header. Odds can therefore be as old as the last feed update, but never older. * **After updating to 1.7**, purge your page cache once. Pages cached by earlier versions still carry the old markup (they keep working through the legacy route, but you won't get the new behaviour until they are rebuilt). * If a CDN or optimization plugin caches `/wp-json/` responses for longer than the header says, exclude `/wp-json/dinodds/v1/` from that rule so the odds stay fresh. * After changing a logo, link or the [Display](https://docs.affkraft.com/dinodds/colors) settings, purge the page cache if you still see the old version: logos and links are part of the odds markup, and the highlight colour is added to the page's styles. ## The settings page or the block are missing The block needs the block editor (WordPress 6.0 or newer). The settings page is in the **DinOdds** menu and only shows for Administrators. The AI & Abilities tab works only on WordPress 6.9 or newer, see [AI & Abilities](https://docs.affkraft.com/dinodds/ai). ## Still stuck? [Contact support](https://affkraft.com/contact) and include your DinOdds and WordPress versions and what the Overview tab shows.