add / get / delete / update_option () не работает в хуке активации (WordPress) - PullRequest
3 голосов
/ 14 мая 2010

Я нахожусь в процессе обновления плагина WordPress, который был выпущен какое-то время, и часть "будущей проверки" плагина заключается в том, чтобы избавиться от некоторых некачественных схем именования, которые были реализованы на начальных фазах плагина.

Я подумал, что просто добавлю ловушку активации, которая проверит, существует ли какое-либо из этих имен, и, если это так, просто удалите массив параметров плагина и отобразите уведомление, позволяющее пользователю знать, что ему нужно обновить своиварианты снова, потому что мы должны были очистить данные для проверки в будущем.Звучит достаточно просто, а?Очевидно, нет.

Я перепробовал все возможные способы, которые только мог придумать, и независимо от того, что я делаю, я НЕ МОГУ получить delete_option (), update_option (), add_option () и get_option () для работы внутрихук активации.

Ниже приведен пример настройки моего хука активации:

// add activation function to get rid of old options and services
function my_activation_hook() {
  global $opts_array;

  //Set variable to false before running foreach loop
  $needs_update = false;

  //Loop through $opts_array['bookmark'] and check for 'badname-' prefix
  foreach($opts_array['bookmark'] as $bkmrk) {
    if(strpos($bkmrk, 'badname-') !== false) {
      //If any have 'badname-' prefix, set variable to true
      $needs_update = true;
    }
  }
  //If variable is true, delete options and set to default
  if($needs_update === true) {

    //Delete the options
    unset($opts_array);
    delete_option('MyPluginOpts');

    //Reset the array to default values
    $opts_array = array(
      'position' => 'below', // below, above, or manual
      'reloption' => 'nofollow', // 'nofollow', or ''
      'targetopt' => '_blank', // 'blank' or 'self'
      'bgimg-yes' => 'yes', // 'yes' or blank
      'mobile-hide' => '', // 'yes' or blank
      'bgimg' => 'shr', // default bg image
      'shorty' => 'b2l',
      'pageorpost' => '',
      'bookmark' => array_keys($bookmarks_opts_data), // pulled from bookmarks-data.php
      'feed' => '1', // 1 or 0
      'expand' => '1',
      'autocenter' => '1',
      'ybuzzcat' => 'science',
      'ybuzzmed' => 'text',
      'twittcat' => '',
      'tweetconfig' => '${title} - ${short_link}', // Custom configuration of tweet
      'defaulttags' => 'blog', // Random word to prevent the Twittley default tag warning
      'warn-choice' => '',
      'doNotIncludeJQuery' => '',
      'custom-mods' => '',
      'scriptInFooter' => '1',
      'vernum' => 'old', //Set to "old" to trigger update notice
    );
    add_option('MyPluginOpts', $opts_array); // Store the option to the database wp_options table in a serialized array
    $opts_array = get_option('MyPluginOpts');// Now reload the variable with stored options from database
  }
}
register_activation_hook(__FILE__, 'my_activation_hook' );

1 Ответ

1 голос
/ 21 ноября 2012

Следующий код представляет собой сводку того, что я построил, когда мне нужно было обновить некоторые «схемы плохого именования» в моем собственном плагине:

Я построил свое решение, задав этот вопрос в WordPress StackExchange. Полный поток стоит прочитать.

class MyPlugin {
    var $adminOptionsName = "MyPlugin";

    function MyPlugin() {
    }

    function init() {
        $this->getAdminOptions();
    }

    function getAdminOptions() {

        // New options and values
        $theNewOptions = array(
            'option_1' => 0,
            'option_2' => '',
            'version'  => '1.0'
        );

        // Grab the options in the database
        $theOptions = get_option($this->adminOptionsName);

        // Check if options need update
        if( !isset($theOptions['version']) && !empty($theOptions) ) {
            foreach( $theOptions as $key => $value ) {
                if( $key == 'not_needed' ) {
                    unset( $theOptions[$key] );
                }
                if( $key == 'old_option_1') {
                    $theOptions['option_1'] = $value;
                    unset( $theOptions[$key] );
                }
                // etc...
            }
        }

        // Proceed to the normal Options check
        if (!empty($theOptions)) {
            foreach ($theOptions as $key => $option) {
                $theNewOptions[$key] = $option;
            }
        }

        update_option($this->adminOptionsName, $theNewOptions);

    }
}
...