Модератор
Yuri
(@yube)
Проверьте, что получается в $ppbv_table. Подозреваю, что там всегда array.
Кстати, а чего не использовали IF NOT EXISTS?
согласен с предыдущим постом, IF NOT EXISTS
используйте, а проверки лучше делайте через empty()
попробую!
просто код писал не я, а я не так силён в php
А можно узнать, где про IF NOT EXISTS можно почитать? не вижу материала..
Если хочется с минимальными усилиями исправить существующий код, можно
попробовать заменить if(is_null($ppbv_table))
на if(empty($ppbv_table))
.
На другом форуме вы привели более полный фрагмент кода, в котором вышеупомянутая функция вызывается с помощью register_activation_hook()
. Я правильно понимаю, что речь идёт о плагине?
правильно.. if(empty($ppbv_table)) не помогает..
действительно, более полный код:
global $wpdb; // вызываем глобальные переменные для работы с функцией
$ppbv_tablename = $wpdb->prefix.'popular_by_views'; // совмещаем префикс и название таблицы
function ppbv_create_table(){
global $wpdb, $ppbv_tablename; // называя global, мы можем использовать эти переменные в функции
$ppbv_table = $wpdb->get_results("SHOW TABLES LIKE '{$ppbv_tablename}'" , ARRAY_N); // если нет результатов, возвращает ноль
if(empty($ppbv_table)){ // если таблиц нет, то:
$create_table_sql = "CREATE TABLE {$ppbv_tablename} (
id BIGINT(50) NOT NULL AUTO_INCREMENT,
post_id VARCHAR(255) NOT NULL,
views BIGINT(50) NOT NULL,
PRIMARY KEY (id),
UNIQUE (id)
);"; // осторожнее с SQL-синтаксисом, он очень чувствителен)
$wpdb->query($create_table_sql); // запускаем SQL запрос к БД
}
}
register_activation_hook(__FILE__,'ppbv_create_table'); // запуск функции 'ppbv_create_table' во время активации плагина
function ppbv_page_viewed(){
if(is_single() && !is_page()){ // только при запуске постов, а не страниц блога
global $wpdb, $post, $ppbv_tablename; // вызываем глобальные переменные для работы с функцией в функции
$wpdb->flush(); // очищает буфер БД
$data = $wpdb->get_row("SELECT * FROM {$ppbv_tablename} WHERE post_id='{$post->ID}'", ARRAY_A); // проверяет данные из столбца, который содержит post ID
if(!is_null($data)){ // если ячейка с данными есть
$new_views = $data['views'] + 1; // увеличиваем количество просмотров на 1
$wpdb->query("UPDATE {$ppbv_tablename} SET views='{$new_views}' WHERE post_id='{$post->ID}';"); // обновляем данные с учётом нового просмотра
$wpdb->flush(); // очищает буфер БД
}
else { // если ещё нет ячейки с данными (тоесть, пока ни одного просмотра)
$wpdb->query("INSERT INTO {$ppbv_tablename} (post_id, views) VALUES ('{$post->ID}','1');"); // добавляем ячейку , отсчёт просмотров начинаетсяс 1
$wpdb->flush(); // очищает буфер БД
}
}
}
add_action('wp_head','ppbv_page_viewed'); // добавляет ppbv_page_viewed к wp_head-счётчику
это код плагина, который я хочу сделать не-плагином
ну а весь код:
ifolder.ru/20860440
это код плагина, который я хочу сделать не-плагином
Т.е. вставить в functions.php
?
if(empty($ppbv_table)) не помогает..
Помогает, но поскольку register_activation_hook()
срабатывает только при активации плагинов, то вне плагина функция не вызывается.
Можно заменить эту строку:
register_activation_hook(__FILE__,'ppbv_create_table');
на такую:
add_action('init', 'ppbv_create_table');
После этого у меня появилась таблица. Чтобы сэкономить запрос к БД, можно потом закомментировать строку.
а можете показать получившися сниппет? я попробовал, но опять эффекта ноль..
да, кстати, вставляю я код вот так:
создаю в папке с темой popbyview.php, в него закидываю код, и вывожуу:
<div>
<?php include(TEMPLATEPATH."/popbyview.php"); ?>
<?php ppbv_display(); ?>
</div>