将自定义术语值保存到新表中的数据库

时间:2015-06-12 作者:user657489

因此,我试图将自定义术语的值保存到数据库中。该表是按自定义术语创建的。下面的代码将文本字段输出到我的自定义术语页面上,但它不会将任何值保存到数据库中。

有人能看出这有什么问题吗?(我肯定我错过了什么)

add_action ( \'movie_edit_form_fields\', \'movie_access_metabox\' );
add_action ( \'edited_movie\', \'save_movie_data\' );

function movie_access_metabox($movie) {
global $wpdb;
$value = $wpdb->get_var(\'select meta_value from wp_termmeta where meta_value=\'.$movie->meta_value);

?>
<tr>
    <th scope="row" valign="top"><label><?php _e(\'Movie year\') ?></label></th>
    <td>
        <input type="text" id="year" name="year" value="" <?php echo $value ?>> 
    </td>
</tr>

<?php
}

function save_movie_data($term_id) {
global $wpdb;
$wpdb->termmeta = \'wp_termmeta\';
if (isset($_POST[\'year\'])) {

    $wpdb->delete(\'wp_termmeta\', array(\'meta_key\' => \'_year\', \'term_id\' => $term_id));
    $wpdb->insert(\'wp_termmeta\', array(\'term_id\' => $term_id, \',meta_key\' => \'_year\', \'meta_value\' => $value));
}else{
    $wpdb->delete(\'wp_termmeta\', array(\'meta_key\' => \'_year\', \'term_id\' => $term_id));
    }
}
更新#1:由于无法获得@Oleg Butuzov提供的答案,我在原来的答案中投入了更多的时间,并将其保存到了将用户输入保存到数据库的阶段。现在的问题是,它似乎只能保存一个值,该值可以更新,但一次只能添加一行。如果有人有任何想法,请提出他们,我会继续更新代码,希望将来能帮助其他人。

更新#2:

*从帖子中删除了错误代码。

事实证明,我只能添加一个值的主要原因是因为我只使用了deleteinsert - 不update 并且没有使用AUTO_INCREMENT 在创建termmeta 架构。下面提供了完整的工作答案。

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

这是我的最终代码,它回答了我的问题。它允许用户通过文本字段输入值,然后添加、替换或从数据库中删除(如果用户键入“delete”)。它还获取该值,并将其显示在输入字段中(如果有)。

function movie_edit_add_year($movie){
  global $wpdb;
  $v = $wpdb->get_var("SELECT meta_value FROM wp_termmeta where term_id =".$movie->term_id);
function has_meta_value($p){
    return isset($p) ? $p : \'\';
}
?>
<tr>
    <th><label>Movie year</label></th>
    <td>
        <input type="text" name="year" style="width:5%;" value="<?php echo has_meta_value($v); ?>" >
    </td>
</tr> <?php
}

add_action( \'edited_movie\', \'save_year_to_movie\');

function save_year_to_movie( $term_id ) {
   global $wpdb;
   $table = $wpdb->prefix . \'termmeta\';
   $val = intval($_POST[\'year\']);
   $var = $wpdb->get_var("SELECT meta_id FROM wp_termmeta where term_id=".$term_id);

if ($_POST[\'year\'] == \'delete\') {
    $wpdb->delete($table, array(\'term_id\' => $term_id));
} elseif (!empty($var)) {
    $wpdb->update($table, array(\'term_id\' => $term_id, \'meta_key\' => \'year\', \'meta_value\' => $val),
        array(\'term_id\' => $term_id), array(\'%d\', \'%s\', \'%d\') );
} else {
    $wpdb->insert($table, array(\'term_id\' => $term_id, \'meta_key\' => \'year\', \'meta_value\' => $val),
        array(\'%d\', \'%s\', \'%d\'));
}
}

SO网友:Oleg Butuzov

简短的exmaple我是怎么做的。。。(表命名不太正确。)

在这个例子中,我试图保存_description $_POST变量。

add_action ( \'edited_term\', \'custom_edited_term\', 10, 3);
function custom_edited_term($term_id, $tt_id, $taxonomy){
    if ( defined(\'DOING_AJAX\') || defined(\'DOING_CRON\') )
            return;

    $_POST = stripslashes_deep($_POST); 
    if (isset($_POST[\'_description\']) && trim($_POST[\'_description\']) != \'\'){
        update_term_meta($term_id, \'_description\', trim($_POST[\'_description\']));
    } else {
        delete_term_meta($term_id, \'_description\');
    }
}
术语元函数

if (!function_exists(\'add_term_meta\')){
    function add_term_meta($term_id, $meta_key, $meta_value, $unique = false) {
        if ( $the_term = wp_is_term_revision($term_id) )
            $term_id = $the_term;
        return add_metadata(\'term\', $term_id, $meta_key, $meta_value, $unique);
    }
}


if (!function_exists(\'delete_term_meta\')){
    function delete_term_meta($term_id, $meta_key, $meta_value = \'\') {
        return delete_metadata(\'term\', $term_id, $meta_key, $meta_value);
    }
}

if (!function_exists(\'get_term_meta\')){
    function get_term_meta($term_id, $key, $single = false) {
        return get_metadata(\'term\', $term_id, $key, $single);
    }       
}



if (!function_exists(\'update_term_meta\')){
    function update_term_meta($term_id, $meta_key, $meta_value, $prev_value = false) {
        return update_metadata(\'term\', $term_id, $meta_key, $meta_value, $prev_value);
    }
}
terms tables声明(您可以将其放在一些init function或functions.php中-由您决定)

global $wpdb;
$wpdb->tables[] = \'termmeta\';
$wpdb->termmeta = $wpdb->prefix.\'termmeta\';
表本身

$wpdb->query("CREATE TABLE IF NOT EXISTS `{$wpdb->prefix}termmeta` (
    `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `term_id` bigint(20) unsigned NOT NULL DEFAULT \'0\',
    `meta_key` varchar(255) DEFAULT NULL,
    `meta_value` longtext,
    PRIMARY KEY (`meta_id`),
    KEY `meta_key` (`meta_key`),
    KEY `term_id` (`term_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1");

结束