web-dev-qa-db-fra.com

Impossible d'obtenir la page des paramètres du plugin pour enregistrer les données

avoir un simple plugin qui insère du texte (une annonce Google) à mi-chemin dans le contenu d'un seul post. J'essaie de créer une page de paramètres qui permettra aux utilisateurs de modifier le code de l'annonce et de modifier le paragraphe après lequel l'annonce apparaît.

J'ai passé toute la journée à lire des didacticiels et du code, et j'ai une belle page de paramètres, mais je ne vois pas comment l'obtenir pour enregistrer les données. Je suis surtout l'exemple de Professional WordPress Plugin Development.

Voici ce que j'ai

<?php
// add plugin options
add_option( 'wpa_ad_insert_paragraph', '2' );
add_option( 'wpa_ad_insert_adcode', 'ad code goes here');

// update options
update_option( 'wpa_ad_insert_paragraph', $_POST['wpa_ad_insert_paragraph'] );
update_option( 'wpa_ad_insert_adcode', $_POST['wpa_ad_insert_adcode'] );

// Add a menu for our option page
add_action('admin_menu', 'wpa_ad_insert_add_page');
function wpa_ad_insert_add_page() {
    add_options_page( 'Ad Insertion', 'Ad Insertion', 'manage_options', 'wpa_ad_insert', 'wpa_ad_insert_option_page' );
}

// Draw the option page
function wpa_ad_insert_option_page() {
    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2>Ad Insertion</h2>
        <form action="options.php" method="post">
            <?php settings_fields('wpa_ad_insert_options'); ?>
            <?php do_settings_sections('wpa_ad_insert'); ?>
            <input name="Submit" type="submit" value="Save Changes" />
        </form>
    </div>
    <?php
}

// Register and define the settings
add_action('admin_init', 'wpa_ad_insert_admin_init');
function wpa_ad_insert_admin_init(){
    register_setting(
        'wpa_ad_insert_options',
        'wpa_ad_insert_options',
        'wpa_ad_insert_validate_options'
    );
    add_settings_section(
        'wpa_ad_insert_main',
        'Ad Insertion Settings',
        'wpa_ad_insert_section_text',
        'wpa_ad_insert'
    );
    add_settings_field(
        'wpa_ad_insert_paragraph',
        'Ad will appear after paragraph number:',
        'wpa_ad_insert_paragraph_setting',
        'wpa_ad_insert',
        'wpa_ad_insert_main'
    );
    add_settings_field(
        'wpa_ad_insert_adcode',
        'Ad code:',
        'wpa_ad_insert_adcode_setting',
        'wpa_ad_insert',
        'wpa_ad_insert_main'
    );
}

function wpa_ad_insert_paragraph_setting() {
    $options = get_option('wpa_ad_insert_paragraph');
    $items = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20");
    echo "<select id='wpa_ad_insert_paragraph' name='plugin_options[wpa_ad_insert_paragraph]'>";
    foreach($items as $item) {
        $selected = ($options['wpa_ad_insert_paragraph']==$item) ? 'selected="selected"' : '';
        echo "<option value='$item' $selected>$item</option>";
    }
    echo "</select>";
}

function wpa_ad_insert_adcode_setting() {
    $options = get_option('wpa_ad_insert_adcode');
    echo "<textarea id='wpa_ad_insert_adcode' name='plugin_options[wpa_ad_insert_adcode]' rows='7' cols='50' type='textarea'>{$options['wpa_ad_insert_adcode']}</textarea>";
}


function wpa_insert_ad($content) {
    $paragraphAfter = get_option('wpa_ad_insert_paragraph');
    $ad = get_option('wpa_ad_insert_adcode');
    if( is_single() && is_main_query() ) {
        $content = explode("</p>", $content);
        for ($i = 0; $i <count($content); $i++ ) {
            if ($i == $paragraphAfter)   
            echo $content[$i] . "</p>";
        }
    }   
    return $content;
}
add_filter('the_content', 'wpa_insert_ad');
?>

Ce code crée une page de paramètres, mais lorsque je sauvegarde la page de paramètres, rien ne se produit (eh bien, la barre jaune indique que mes paramètres ont été enregistrés, mais les informations ne sont définitivement pas enregistrées dans la base de données.

Qu'est-ce que j'oublie ici?

1
Morgan Kay

Lorsque vous utilisez l’API Settins, vous n’avez donc pas besoin d’utiliser les fonctions update_option ou add_option. L'API de paramètres gérerait cela tout seul.

Il y avait peu de problèmes c'est pourquoi votre code ne fonctionne pas.

1.

add_settings_section(
    'wpa_ad_insert_main',
    'Ad Insertion Settings',
    'wpa_ad_insert_section_text',
    'wpa_ad_insert'
);

Le 3ème paramètre est la fonction de rappel. Étant donné que vous n'avez pas besoin de cette fonction, ajoutez simplement __return false comme rappel. Alors votre code pour cette fonction serait comme:

add_settings_section(
    'wpa_ad_insert_main',
    'Ad Insertion Settings',
    '__return_false',
    'wpa_ad_insert'
);

2.

register_setting(
    'wpa_ad_insert_options',
    'wpa_ad_insert_options',
    'wpa_ad_insert_validate_options'
);

Regardez le code ci-dessus. Étant donné que le deuxième paramètre est le nom de l'option, vous devez utiliser ce nom lorsque vous souhaitez extraire l'option de la base de données. Au lieu d'appeler ce nom d'option, vous avez appelé deux noms d'option énumérés ci-dessous:

$options = get_option('wpa_ad_insert_paragraph');
$options = get_option('wpa_ad_insert_adcode');

Etant donné que vous avez utilisé un autre nom d'option dans la fonction register_setting, vous n'avez donc pas pu récupérer l'option dans la base de données. Vous devez pouvoir appeler la fonction get_option avec le nom de l’option que vous avez enregistrée avec la fonction register_setting. Et ce serait comme:

$options = get_option('wpa_ad_insert_options');

3. Mais les données ne sont toujours pas sauvegardées dans la base de données, n'est-ce pas? Parce que vous avez utilisé plugin_options comme nom de votre entrée de formulaire et de votre zone de texte. Puisque vous utilisez les paramètres de l'API de paramètres wordpress, vous devez utiliser le même nom que vous avez enregistré comme option_name dans la fonction register_setting.

Donc, vous devez corriger quelques problèmes pour rendre ce code utilisable. J'ai modifié quelques lignes de votre code et cela fonctionne. Remplacez votre fonction register_setting par celle-ci:

register_setting(
    'wpa_ad_insert_options',
    'plugin_options',
    'wpa_ad_insert_validate_options'
);

Remplacez votre fonction add_settings_section par celle-ci:

add_settings_section(
    'wpa_ad_insert_main',
    'Ad Insertion Settings',
    '__return_false',
    'wpa_ad_insert'
);

Remplacez toutes les fonctions get_option par celle-ci: $ options = wpa_options ('plugin_options');

Et ajoutez enfin ce nouveau code:

function wpa_options() {
    $default = array(
        'wpa_ad_insert_paragraph' => 1,
        'wpa_ad_insert_adcode' => ''
        );
    return get_option('plugin_options', $default);
}

Rassemblez tout cela:

// Add a menu for our option page
add_action('admin_menu', 'wpa_ad_insert_add_page');
function wpa_ad_insert_add_page() {
    add_options_page( 'Ad Insertion', 'Ad Insertion', 'manage_options', 'wpa_ad_insert', 'wpa_ad_insert_option_page' );
}

// Draw the option page
function wpa_ad_insert_option_page() {
    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2>Ad Insertion</h2>
        <form action="options.php" method="post">
            <?php settings_fields('wpa_ad_insert_options'); ?>
            <?php do_settings_sections('wpa_ad_insert'); ?>
            <input name="Submit" type="submit" value="Save Changes" />
        </form>
    </div>
    <?php
}

// Register and define the settings
add_action('admin_init', 'wpa_ad_insert_admin_init');
function wpa_ad_insert_admin_init(){
    register_setting(
        'wpa_ad_insert_options',
        'plugin_options',
        'wpa_ad_insert_validate_options'
    );
    add_settings_section(
        'wpa_ad_insert_main',
        'Ad Insertion Settings',
        // 'wpa_ad_insert_section_text',
        '__return_false',
        'wpa_ad_insert'
    );
    add_settings_field(
        'wpa_ad_insert_paragraph',
        'Ad will appear after paragraph number:',
        'wpa_ad_insert_paragraph_setting',
        'wpa_ad_insert',
        'wpa_ad_insert_main'
    );
    add_settings_field(
        'wpa_ad_insert_adcode',
        'Ad code:',
        'wpa_ad_insert_adcode_setting',
        'wpa_ad_insert',
        'wpa_ad_insert_main'
    );
}

register_setting(
    'wpa_ad_insert_options',
    'plugin_options',
    'wpa_ad_insert_validate_options'
);

function wpa_ad_insert_paragraph_setting() {
    $options = wpa_options('plugin_options');
    $items = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20");
    echo "<select id='wpa_ad_insert_paragraph' name='plugin_options[wpa_ad_insert_paragraph]'>";
    foreach($items as $item) {
        $selected = ($options['wpa_ad_insert_paragraph']==$item) ? 'selected="selected"' : '';
        echo "<option value='$item' $selected>$item</option>";
    }
    echo "</select>";
}

function wpa_ad_insert_adcode_setting() {
    $options = wpa_options('plugin_options');
    echo "<textarea id='wpa_ad_insert_adcode' name='plugin_options[wpa_ad_insert_adcode]' rows='7' cols='50' type='textarea'>{$options['wpa_ad_insert_adcode']}</textarea>";
}


function wpa_insert_ad($content) {
    $paragraphAfter = get_option('wpa_ad_insert_paragraph');
    $ad = get_option('wpa_ad_insert_adcode');
    if( is_single() && is_main_query() ) {
        $content = explode("</p>", $content);
        for ($i = 0; $i <count($content); $i++ ) {
            if ($i == $paragraphAfter)   
            echo $content[$i] . "</p>";
        }
    }   
    return $content;
}
add_filter('the_content', 'wpa_insert_ad');

function wpa_options() {
    $default = array(
        'wpa_ad_insert_paragraph' => 1,
        'wpa_ad_insert_adcode' => ''
        );
    return get_option('plugin_options', $default);
}
2
Saikat

J'ai tout recommencé en utilisant le plugin Options du plug-in Starter Kit - http://www.presscoders.com/plugins/plugin-options-starter-kit/ . Ceci est un plugin de Nice. En réalité, il ne s'agit pas vraiment d'un plug-in, mais simplement d'une page de paramètres de plug-in avec toutes les options que vous pouvez utiliser. Il est donc facile de copier/coller/couper/configurer pour faire ce que vous voulez. Je ne sais toujours pas pourquoi mon code ci-dessus ne fonctionne pas (à part le fait que la version collée ci-dessus n'a pas la fonction de validation, mais l'ajout de retour dans n'a pas résolu le problème), donc si quelqu'un veut Dites-moi ce que je devais faire d'autre pour que cela fonctionne, j'aimerais savoir.

0
Morgan Kay

Le problème est l'emplacement dans le code où vous codez la mise à jour.

Une fois que vous avez soumis le formulaire, options.php est chargé et votre plug-in est chargé. À ce stade, les options sont mises à jour à partir des données de publication. Ensuite, vous êtes redirigé vers votre page de paramètres et votre code est exécuté à nouveau, mais cette fois, il n'y a pas de valeur dans $_POST et vos options sont remplies avec une valeur vide.

Si vous utilisez l’API de paramètres, vous devriez lui laisser la mise à jour des options, et même si votre code de mise à jour n’aurait pas dû être

if (isset($_POST['wpa_ad_insert_paragraph'] )) {
  pdate_option( 'wpa_ad_insert_paragraph', $_POST['wpa_ad_insert_paragraph'] );
  update_option( 'wpa_ad_insert_adcode', $_POST['wpa_ad_insert_adcode'] );
}

Add_option est maintenant presque un alias de update_option. Si l'option existe, elle se comportera comme update_option. Si update_option est appelée alors que l'option n'existe pas, elle sera ajoutée. Par conséquent, vous devez vérifier la non-existence de l'option avant de l'initialiser.

if (!get_option('wpa_ad_insert_paragraph')) {
  add_option( 'wpa_ad_insert_paragraph', '2' );
  add_option( 'wpa_ad_insert_adcode', 'ad code goes here');
}

get_option renvoie false lorsque l'option n'existe pas (mais vous devez faire attention si false est l'une des valeurs que votre option peut avoir)

0
Mark Kaplun

Il semble que vous ayez quelques problèmes ici. Le premier problème est que vous devez séparer le résultat de la logique. Fondamentalement, l’action admin_init que vous appelez n’est probablement pas exécutée correctement car elle est trop tardive dans la timeline. Voir cette question similaire ici et la réponse: Impossible de générer do_settings_sections. Je ne comprends pas pourquoi

Le deuxième problème est que la fonction register_setting() ne crée pas réellement les options de paramètres dans la base de données. Vous devez faire quelque chose comme ça:

    // Register and define the settings
    add_action('admin_init', 'wpa_ad_insert_admin_init');
function wpa_ad_insert_admin_init(){

    // This will make sure your options are created in the database
    if( false === get_option( 'wpa_ad_insert_options' ) ) {
        add_option( 'wpa_ad_insert_options' );
    }

    register_setting(
        'wpa_ad_insert_options',
        'wpa_ad_insert_options',
        'wpa_ad_insert_validate_options'
    );

    ...

La vérification au début de la fonction s'assurera que vous créez l'option pour enregistrer les paramètres. Il y avait un problème similaire ici: Pourquoi register_setting () ne crée-t-il pas de paramètre?

Comme @MarkKaplun l'a dit dans sa réponse, vous devriez également supprimer le code update_option et laisser WordPress le gérer pour vous.

Lorsque vous utilisez register_setting(), le deuxième argument est l'option de la base de données dans laquelle vous souhaitez l'enregistrer. C'est pourquoi vous devez vous assurer que l'option existe avant d'enregistrer le paramètre.

À première vue, les problèmes que j'ai mentionnés ci-dessus ressemblent aux plus importants, mais il peut y en avoir d'autres une fois que vous avez résolu ces problèmes et nous pouvons travailler à partir de là.

0
Nick Young