如何按键删除用户元

时间:2014-03-02 作者:Neovea

我是WordPress插件api、php和ajax的初学者。我正在为自己编写一个培训插件,将文章保存起来,以便以后阅读,就像web浏览器上的收藏夹一样,带有文件夹。

我使用oop来实现这一点。

我假设创建一个名为“favoris”的新用户元,它是一个包含用户创建的文件夹的数组。

我有这样的东西来获取FAV、创建文件夹和删除它们。

/**
 * Get favorites
 */
public function fp_ajax_getFav(){
    $current_user = wp_get_current_user();
    $userid = $current_user->ID;
    $folder = get_user_meta($userid, \'favoris\');
    $content =  \'\';
    $content .= \'Favoris\';
    $content .= \'\';
    $content .= \'\';
    $content .= \'\';
    $content .= \'\';

    if (!empty($folder)) {
        $content .= \'Tout supprimer\';
        $content .= \'Aucun favoris.\';
    }
    else{
        $content .= \'Tout supprimer\';
        $content .= \'Aucun favoris.\';
    }

    $content .= \'\';

    if (!empty($folder)) {
        $msg = \'\';
        foreach ($folder as $key) {
            foreach ($key as $k => $value) {
                $content .= \' \' . ucwords($value[\'titre\']) . \'\';
            }
        }
    }
    else{
    }
    $content .= \'\';
    $content .= \'\';
    return $content;
}

/**
 * Add folder
 */
public function fp_ajax_addFolder(){
    $current_user = wp_get_current_user();
    $userid = $current_user->ID;
    $meta = get_user_meta($userid, \'favoris\');
    if (empty($meta)) {
        if ($_REQUEST[\'foldername\'] !== \'\') {
            $folder[0][\'titre\'] = $_REQUEST[\'foldername\'];
            add_user_meta($userid, \'favoris\', $folder);
            var_dump($folder);
            echo ucwords($_REQUEST[\'foldername\']);
            die();
        }
    }
    if (!empty($meta)) {
        $folder = $meta[0];
        if ($_REQUEST[\'foldername\'] != \'\') {
            foreach ($folder as $key => $value) {
                $i = count($folder);
                if ($value[\'titre\'] != $_REQUEST[\'foldername\']) {
                    $folder[$i][\'titre\'] = $_REQUEST[\'foldername\'];
                    update_user_meta($userid, \'favoris\', $folder);
                    var_dump($folder);
                    echo ucwords($_REQUEST[\'foldername\']);
                    die();
                }
            }
        }
    }
}

/**
 * Remove folder
 */
public function fp_ajax_removeFolder(){
    if ( ( !isset($_POST[\'folderId\']) || empty($_POST[\'folderId\']) ) && ( !isset($_POST[\'folderName\']) || empty($_POST[\'folderName\']) ) ) {
        echo \'Pas de dossier spécifié\';
        die();
    }
    else{
        $id = $_POST[\'folderId\'];
        $name = $_POST[\'folderName\'];
        $current_user = wp_get_current_user();
        $userid = $current_user->ID;
        $folder = get_user_meta($userid, \'favoris\');
        $folderToErase = $folder[0][$id];
        try {
            delete_user_meta($userid, \'favoris\', $folder[0][$id]);
            echo $folderToErase[\'titre\'];
            //print_r($folder[0][$id][\'titre\']);
        } 
        catch (Exception $e) {
            echo \'not ok\';
            var_dump($folder);
            return $e->getMessage();
        }
        die();
    }
}


就我所得到或创造的而言,一切都很顺利。但当我想按键($id)删除文件夹时,它不会删除。但当我回显$folderToErase时,id是正确的。

也许能帮点忙?

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

根据问题注释,您的数据存储在数据库中的序列化数组中:

... it\'s stored as the api\'s working for. It looks like that in the database : `a:3:{i:0;a:1:{s:5:"titre";s:3:"sfg";}i:1;a:1:{s:5:"titre";s:4:"test";}i:2;a:1:{s‌​:5:"titre";s:4:"test";}}`
您试图通过将密钥传递给delete_user_meta(). 不是这样的delete_user_meta() 作品不会的unserialize() 该值并移除阵列的单个部分。它将删除表中键和值完全匹配的行。那不是你想要的。对于序列化数据,最终得到的是一个需要自己处理的数组。

像这样的方法应该会奏效:

//      $id = $_POST[\'folderId\'];
// fake $_POST[\'folderID\']
$id = \'test\';
$current_user = wp_get_current_user();
$userid = $current_user->ID;
//         $folder = get_user_meta($userid, \'favoris\');
// fake the get_user_meta call
$folder = unserialize(\'a:3:{i:0;a:1:{s:5:"titre";s:3:"sfg";}i:1;a:1:{s:5:"titre";s:4:"test";}i:2;a:1:{s:5:"titre";s:4:"test";}}\');

try {
  foreach ($folder as $k => $m) {
    if ($m[\'titre\'] === $id) {
      unset($folder[$k]);
    }
  }
  update_user_meta($userid, \'favoris\', $folder);
} 
catch (Exception $e) {
  echo \'not ok\';
  return $e->getMessage();
}
您需要做的是处理阵列,删除不需要的部分,然后重新保存它。

注意:当我开始写这段代码时,我意识到我不能百分之百确定您想要完成什么。你的一些$_POST 数据对我来说并不完全清楚。不过这应该会让你走上正轨。

结束

相关推荐

Plugins_url函数混合了系统路径和URL

在我的WordPress小部件中,我使用以下代码:wp_register_script(\'jquery-ui.widget\', plugins_url(\'assets/js/jquery-ui-1.9.2.widget.js\', dirname( __FILE__ ))); 不幸的是,代码给了我一个无效的URL,它与我的系统路径混合在一起:http://test.dev/wp-content/plugins/C:/projects/wordpress/plugins/assets/js/