• Hi everyone,

    I’m working on integrating a third-party API into my WordPress site, but I’m running into a problem with registering the API key properly.

    Here’s what I’ve tried so far:

    • I created a small custom plugin where I added a settings page for entering the API key.
    • I’m using the WordPress Settings API (register_setting, add_settings_section, add_settings_field) to store the key in the database.
    • The key seems to save correctly in the options table, but when I make API requests from the plugin, it looks like the key isn’t being recognized (the API returns “Invalid API key” error).
    • If I hard-code the API key directly in the function, it works fine — so I think the issue is with how I’m registering or retrieving the saved option.

    Here’s a snippet of how I’m calling it:

    $api_key = get_option('my_plugin_api_key');
    $response = wp_remote_get( "https://api.example.com/data?api_key=$api_key" );

    Has anyone else faced this kind of issue with storing/retrieving API keys through the WordPress Settings API? Am I missing something in the registration step or sanitization callback?

    Thanks in advance for any guidance!

Viewing 3 replies - 1 through 3 (of 3 total)
  • Moderator threadi

    (@threadi)

    Take a close look at exactly what API key is being read. var_dump() is very helpful for debugging.

    Example:

    $api_key = get_option('my_plugin_api_key');
    var_dump( $api_key );
    $response = wp_remote_get( "https://api.example.com/data?api_key=$api_key" );

    It’s best to look at this in the WP CLI or in the browser source code, not in the browser itself, as it may already interpret the characters contained therein.

    Also check carefully whether “my_plugin_api_key” is really the option_name of the setting with the key.

    Hey there

    I have had a similar problem in past. Can you also share your code where you are actually storing the Option?

    There is a possibility of wrong option name or shape.

    Are you saving as a scalar (my_plugin_api_key) but reading an array (or vice-versa)?

    If your field name is name="my_plugin_api_key[api_key]"in that case get_option('my_plugin_api_key') returns an array. In that case use $opts = get_option('my_plugin_api_key'); then $api_key = $opts['api_key'] ?? '';

    I hope it helps you

    Take care

    Hi @deenjames,

    Great work on setting up the settings page and getting your plugin to save the API key to the database! Since hard-coding the key works but retrieving it via get_option() doesn’t, the issue likely lies in how it’s being stored or retrieved. What to Check & Next Steps 1. Debug What’s Actually Being Retrieved

    Dump the value you’re getting from the database to confirm what’s being returned:

    $api_key = get_option('my_plugin_api_key'); var_dump($api_key);

    Run this via WP-CLI or inspect the raw HTML output, not just in browser-rendered view — some characters may get stripped or transformed during rendering. This will help reveal if it’s empty, malformed, or nested within an array. WordPress.org 2. Ensure Option Name Matches Exactly

    Even a tiny mismatch (e.g., a typo or difference in naming convention) between your register_setting() and get_option() can result in retrieving nothing or unknown values. Double-check that:

    • The option name in register_setting() matches the one in get_option()
    • There are no stray characters or whitespace in the name WordPress.org

    3. Check If Option Is Scalar or Array

    If your settings input field uses array naming syntax — for example, <input name="my_plugin_api_key[api_key]" ...> — WordPress will save the option as an array, not a string. In that case, calling get_option('my_plugin_api_key') returns an array, and you’d need to access the API key like this:

    $opts = get_option('my_plugin_api_key'); $api_key = isset($opts['api_key']) ? $opts['api_key'] : '';

    This setup mismatch could definitely cause the “Invalid API key” response you’re seeing. WordPress.org Summary Table CheckpointWhat to DoRetrieve & inspect valueUse var_dump() outside of browser-rendered view to see raw dataOption name alignmentConfirm exact match between register_setting() and get_option()Data structure checkDetermine if option is a string or array and handle accordingly

    Once you’ve verified the retrieval and structure, test your API request again with the extracted value. If you’re still seeing issues, feel free to share the relevant snippet of your settings and retrieval code—I’d be happy to help debug further!

Viewing 3 replies - 1 through 3 (of 3 total)

You must be logged in to reply to this topic.