WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Совет по плагину Democracy Polls

Уважаемый разработчик, я доработал ваш код для своего сайта и хотел бы поделиться с вами. Думаю, что ваше название пока не очень оправдано. Чтобы его полностью оправдать, предлагаю сделать глобальный параметр "Проверять на динамический ip", ведь, как известно, у обычных пользователей динамический ip меняет только последние цифры (после последней точки), поэтому я добавил такую проверку.

Файл class.DemPoll.php:

function get_logs_voted_data(){
global $wpdb;

$user_ip = ip2long( $_SERVER['REMOTE_ADDR'] );
$ipfen = $_SERVER['REMOTE_ADDR'] ;
list($van, $two, $three) = explode('.', $ipfen);
$AND = $wpdb->prepare('AND shortip1 = %d AND shortip2 = %d AND shortip3 = %d', $van, $two, $three);

// нужно проверять пользователя и IP отдельно! А то есил пользователь не залогинен у него id 0 и он будет совпадать со всеми другими незалогиненными пользователями
if( $user_id = get_current_user_id() ){
//$AND = $wpdb->prepare('AND userid = %d', $user_id ); // только для пользователей, IP не учитывается, т.е. если вы голосовали как посетитель, а потом залогинились, то можено будет голосовать еще раз
// $AND = $wpdb->prepare('AND (userid = %d OR ip = %d OR shortip = %d )', $user_id, $user_ip, $ipshortfen);
$AND = $wpdb->prepare('AND ( userid = %d OR ( shortip1 = %d AND shortip2 = %d AND shortip3 = %d ) )', $user_id, $van, $two, $three);
}

// Ищем пользвоателя или IP в базе
$sql = $wpdb->prepare("SELECT * FROM $wpdb->democracy_log WHERE qid = %d $AND", $this->id );
$res = $wpdb->get_results( $sql );

if( $res ) $res = array_shift( $res );

return $res;
}

...

protected function add_logs(){
if( ! $this->id ) return false;

global $wpdb;

$user_ip = ip2long( $_SERVER['REMOTE_ADDR'] );
$ipfen = $_SERVER['REMOTE_ADDR'] ;
list($van, $two, $three) = explode('.', $ipfen);

$data = array(
'ip' => $user_ip,
'qid' => $this->id,
'aids' => $this->votedFor,
'userid' => (int) get_current_user_id(),
'date' => current_time('mysql'),
'expire' => $this->expire_time(),
'shortip1' => $van,
'shortip2' => $two,
'shortip3' => $three,
);
//wp_die(print_r( $data ));
$foo = $wpdb->insert( $wpdb->democracy_log, $data );
}

По сути можете проверять и по ип, но в случае, если будет отключена проверка на динамику, а так можно и без точного совпадения обойтись, ведь ip и так совпадет!

Только надо добавить еще вставку столбцов автоматически в таблицу, ведь у меня это локальное решение и я все ручками сделал.

 

Спасибо за понимание,

Никита Димитрюк.

0
Гость
8.4 года назад
  • 0
    Kama9616

    Спасибо за идею! Очень может быть что скоро внесу эту функцию. Только не так как вы предложили.

    Зачем разделять на 3 части и записывать их отдельно, если при проверке все равно запрос с AND

    $wpdb->prepare('AND ( userid = %d OR ( shortip1 = %d AND shortip2 = %d AND shortip3 = %d ) )', $user_id, $van, $two, $three);

    Почему в одно поле не записали как xxx.xxx.xxx?

    Думаю вообще убрать это преобразование в ip2long(). Еще до этого хотел, а с этим подавно...

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация