我正在开发一个个人投票插件,我不打算公开发布它,因为我还在学习WP。
一般来说,你可以投票给帖子“向上”或“向下”。我有两个表,一个收集IP(不允许多次投票),另一个名为“post\\u votes”的表收集每个帖子的投票数。
当我发布一篇新帖子时,它的ID存储在“post\\u votes”中,我可以在人们投票时更新每个帖子的“up”、“down”。这在几天前奏效了。我做了一些修改,但我不明白为什么它不再工作了。。
这是目前为止的全部代码。。我仍然需要实施一些安全预防措施。
<?php
/*
Plugin Name: Vote Posts
*/
global $vote_posts_version;
$vote_posts_version = "1.0";
function vote_posts_install () {
global $wpdb;
global $vote_posts_version;
$table_1 = $wpdb->prefix . "voter_ips";
$table_2 = $wpdb->prefix . "vote_posts";
if($wpdb->get_var("SHOW TABLES LIKE \'$table_1 AND $table_2\'") != $table_1 && $table_2) {
$sql = "CREATE TABLE " . $table_1 . " (
id bigint(20) NOT NULL AUTO_INCREMENT,
vote_post_id bigint(20) NOT NULL,
voter_ip varchar(100) NOT NULL,
UNIQUE KEY id (id)
);";
$sql2 = "CREATE TABLE " . $table_2 . " (
id bigint(20) NOT NULL AUTO_INCREMENT,
vote_post_id bigint(20) NOT NULL,
up int(11) NOT NULL,
down int(11) NOT NULL,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql);
dbDelta($sql2);
add_option("vote_posts_version", $vote_posts_version);
}
}
register_activation_hook(__FILE__,\'vote_posts_install\');
//add and delete votes
function add_votes($post_ID) {
global $wpdb;
if (!($wpdb->get_row("SELECT vote_post_id FROM wp_vote_posts WHERE vote_post_id = $post_ID" ) ) ) { //if not exists add post ID to table
$wpdb->insert( $wpdb->prefix . \'vote_posts\', array( \'post_id\' => $post_ID ) );
return $post_ID;
}
}
add_action ( \'publish_post\', \'add_votes\' ); //should trigger function on publish post
function delete_votes($post_ID) {
global $wpdb;
$wpdb->query("DELETE FROM wp_vote_posts WHERE vote_post_id = $post_ID");
return $post_ID;
}
add_action ( \'delete_post\', \'delete_votes\' ); //deletes row from post_votes table when a post is deleted from the WP panel
?>
它成功创建了这两个表,但没有在操作中插入post ID
最合适的回答,由SO网友:Denis de Bernardy 整理而成
无意冒犯,但我想我同意你另一个问题的评论。。。在学习这些之前,您确实需要阅读PHP、MySQL和正则表达式教程。更重要的是,您需要学习如何在您喜爱的编辑器中使用正则表达式搜索代码库,并理解您正在阅读的代码。
仅举几个例子,如下所示:
SHOW TABLES LIKE \'$table_1 AND $table_2\'
正在查找名为:
$wpdb->prefix . "voter_ips AND " . $wpdb->prefix . "vote_posts"
糟糕,糟糕,糟糕。。。
同样,虽然您的表都有一个非空的唯一键,从技术上讲,这相当于主键,但MySQL重写引擎和优化器并没有将它们视为主键,因此您应该将其声明为主键。
然后,存在潜在的安全漏洞:
SELECT vote_post_id FROM wp_vote_posts WHERE vote_post_id = $post_ID
。。。无需事先将$post\\u ID转换为(int)。。。
如果您没有使用PHP调试器,那么var\\u dump()内容也会有所帮助。e、 g.在您的add\\u voates()调用中,看看发生了什么,怎么样
var_dump($post_ID);die;