wp_insert_post() создаёт две записи в таблице вместо одной
-
Доброго времени суток,
Пытаюсь создать пост с помощью wp_insert_post() в 2.8.5-й версии (до этого с wordpress-ом не приходилось работать), но вместо одной получаю две идентичные записи в базе. Вот пример скрипта:
$post[‘post_title’] = «test3»;
$post[‘post_content’] = «toje test3»;
$post[‘post_status’] = ‘publish’;
$post[‘post_author’] = 1;
$post[‘post_category’] = array(0);
$post[‘post_date’] = «2009-10-01 01:01:01»;
$post[‘post_date_gmt’] = «2009-10-01 01:01:01»;$post = add_magic_quotes($post);
$postID = wp_insert_post($post);Копался в движке пытаясь определить источник проблемы, но не удалось найти решения. В частности в файле wp-includes/wp-db.php на 678-й строке прослушал значения переменной на разных стадиях исполнения SQL команд. Среди прочих перехватил это:
INSERT INTO
wp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-10-01 01:01:01′,’2009-10-01 01:01:01′,’toje test3′,»,’test3′,»,’publish’,’post’,’open’,’open’,»,’test3′,»,»,’2009-10-01 01:01:01′,’2009-10-01 01:01:01′,’0′,’0′,»)Данная команда прослушивается в переменной, как и полагается, один раз. Однако, в базе создаются две идентичные записи, вместо одной. Предположительно вторая запись создаётся ещё где-то.
Помощь треба, буду очень признателен.
-
Забыл приписать: переменная файле wp-includes/wp-db.php на 678-й строке это $query.
Пока не удалось воспроизвести — на тестовом блоге скрипт создаёт только одну запись.
Я сделал короткую видеозапись. Пожалуйста просмотрите. При первом постинге создаются две записи, при втором — одна. Причем при первом постинге php ругается на значение переменной NULL, тогда как во второй раз, при том же значении Warning уже не выдаёт. Это уже другая переменная — $wp_rewrite->feeds и находится в wp-includes\post.php на 1779-й строке. Может в ней всё дело?
Так нагляднее 🙂 Нужно связать создание записи с одним из встроенных действий — например,
init
:function test_insertPostsInit() { $postID = test_insertPosts('test title', 'test content'); } add_action('init', 'test_insertPostsInit');
Пхп уже не ругается, это плюс. Но в этот раз двойной пост создался на второй попытке refresh-а. Может надо привязать к другому действию?
Пришлось покопаться в логах mysql, чтобы сузить поле поиска. Как я уже говорил, при первом посте создаётся одна запись, при втором — две. Далее уже идёт вперемежку: то по одной, то по две. Но сосредоточусь на первых двух для наглядности.
Итак вот запись в логах mysql на первый запрос:
Time Id Command Argument
091104 20:09:50 1 Connect admin@localhost on
1 Query SET NAMES utf8
1 Init DB wordpress
1 Query SELECT option_name, option_value FROM wp_options WHERE autoload = ‘yes’
091104 20:09:51 1 Query SELECT * FROM wp_users WHERE user_login = ‘admin’
1 Query SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 1
1 Query SELECT option_value FROM wp_options WHERE option_name = ‘sidebars_widgets’ LIMIT 1
1 Query SELECT post_name FROM wp_posts WHERE post_name = ‘test-title’ AND post_type = ‘post’ AND ID != 0 LIMIT 1
1 Query INSERT INTOwp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-11-04 20:09:51′,’2009-11-04 17:09:51′,’test content’,»,’test title’,»,’publish’,’post’,’open’,’open’,»,’test-title’,»,»,’2009-11-04 20:09:51′,’2009-11-04 17:09:51′,’0′,’0′,’somethingsss’)
1 Query SELECT tr.term_taxonomy_id FROM wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (3) AND tt.taxonomy IN (‘category’)
1 Query SELECT * FROM wp_posts WHERE ID = 3 LIMIT 1
1 Query SELECT ID FROM wp_posts WHERE post_parent = 3
1 Query SELECT * FROM wp_posts WHERE ID = 3 LIMIT 1
1 Query INSERT INTOwp_postmeta
(post_id
,meta_value
,meta_key
) VALUES (‘3′,’1′,’_pingme’)
1 Query INSERT INTOwp_postmeta
(post_id
,meta_value
,meta_key
) VALUES (‘3′,’1′,’_encloseme’)
1 Query UPDATEwp_options
SEToption_value
= ‘a:3:{i:1257354591;a:1:{s:8:\»do_pings\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:2:{s:8:\»schedule\»;b:0;s:4:\»args\»;a:0:{}}}}i:1257381374;a:3:{s:16:\»wp_version_check\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:3:{s:8:\»schedule\»;s:10:\»twicedaily\»;s:4:\»args\»;a:0:{}s:8:\»interval\»;i:43200;}}s:17:\»wp_update_plugins\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:3:{s:8:\»schedule\»;s:10:\»twicedaily\»;s:4:\»args\»;a:0:{}s:8:\»interval\»;i:43200;}}s:16:\»wp_update_themes\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:3:{s:8:\»schedule\»;s:10:\»twicedaily\»;s:4:\»args\»;a:0:{}s:8:\»interval\»;i:43200;}}}s:7:\»version\»;i:2;}’ WHEREoption_name
= ‘cron’
1 Query SELECT ID FROM wp_posts WHERE post_parent = 3
1 Query SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = ‘post’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’) ORDER BY wp_posts.post_date DESC LIMIT 0, 10
1 Query SELECT FOUND_ROWS()
1 Query SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN (‘category’, ‘post_tag’) AND tr.object_id IN (3) ORDER BY t.name ASC
1 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (3)
1 Query SELECT option_value FROM wp_options WHERE option_name = ‘kubrick_header_image’ LIMIT 1
1 Query SELECT option_value FROM wp_options WHERE option_name = ‘kubrick_header_color’ LIMIT 1
1 Query SELECT option_value FROM wp_options WHERE option_name = ‘kubrick_header_display’ LIMIT 1
1 Query SELECT * FROM wp_posts WHERE (post_type = ‘page’ AND post_status = ‘publish’) ORDER BY menu_order, post_title ASC
1 Query SELECT option_value FROM wp_options WHERE option_name = ‘page_for_posts’ LIMIT 1
1 Query SELECT YEAR(post_date) ASyear
, MONTH(post_date) ASmonth
, count(ID) as posts FROM wp_posts WHERE post_type = ‘post’ AND post_status = ‘publish’ GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC
1 Query SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN (‘category’) ORDER BY t.name ASC
1 Query SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN (‘link_category’) AND tt.count > 0 ORDER BY t.name ASC
1 Query SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = ‘Y’ AND ( tt.term_id = 2 ) AND taxonomy = ‘link_category’ ORDER BY link_name ASC
1 QuitКак видно из записей, было установленно одно соединение с mysql (назовём его номер 1):
091104 20:09:50 1 Connect admin@localhost on
Далее, среди прочих запросов, была одна вставка в таблицу:
1 Query INSERT INTO
wp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-11-04 20:09:51′,’2009-11-04 17:09:51′,’test content’,»,’test title’,»,’publish’,’post’,’open’,’open’,»,’test-title’,»,»,’2009-11-04 20:09:51′,’2009-11-04 17:09:51′,’0′,’0′,’somethingsss’)После этого соединение №1 было закрыто
1 Quit
.
Теперь перейдём к записям при втором постинге. Вот полный лог:
091104 20:10:25 2 Connect admin@localhost on
2 Query SET NAMES utf8
2 Init DB wordpress
2 Query SELECT option_name, option_value FROM wp_options WHERE autoload = ‘yes’
2 Query UPDATEwp_options
SEToption_value
= ‘1257354625’ WHEREoption_name
= ‘_transient_doing_cron’
3 Connect admin@localhost on
3 Query SET NAMES utf8
3 Init DB wordpress
3 Query SELECT option_name, option_value FROM wp_options WHERE autoload = ‘yes’
3 Query SELECT option_value FROM wp_options WHERE option_name = ‘sidebars_widgets’ LIMIT 1
3 Query SELECT post_name FROM wp_posts WHERE post_name = ‘test-title’ AND post_type = ‘post’ AND ID != 0 LIMIT 1
3 Query SELECT post_name FROM wp_posts WHERE post_name = ‘test-title-2’ AND post_type = ‘post’ AND ID != 0 LIMIT 1
3 Query INSERT INTOwp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-11-04 20:10:25′,’2009-11-04 17:10:25′,’test content’,»,’test title’,»,’publish’,’post’,’open’,’open’,»,’test-title-2′,»,»,’2009-11-04 20:10:25′,’2009-11-04 17:10:25′,’0′,’0′,’somethingsss’)
3 Query SELECT tr.term_taxonomy_id FROM wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (4) AND tt.taxonomy IN (‘category’)
3 Query SELECT * FROM wp_posts WHERE ID = 4 LIMIT 1
3 Query SELECT ID FROM wp_posts WHERE post_parent = 4
3 Query SELECT * FROM wp_posts WHERE ID = 4 LIMIT 1
3 Query INSERT INTOwp_postmeta
(post_id
,meta_value
,meta_key
) VALUES (‘4′,’1′,’_pingme’)
3 Query INSERT INTOwp_postmeta
(post_id
,meta_value
,meta_key
) VALUES (‘4′,’1′,’_encloseme’)
3 Query SELECT ID FROM wp_posts WHERE post_parent = 4
3 Query UPDATEwp_options
SEToption_value
= ‘a:2:{i:1257381374;a:3:{s:16:\»wp_version_check\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:3:{s:8:\»schedule\»;s:10:\»twicedaily\»;s:4:\»args\»;a:0:{}s:8:\»interval\»;i:43200;}}s:17:\»wp_update_plugins\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:3:{s:8:\»schedule\»;s:10:\»twicedaily\»;s:4:\»args\»;a:0:{}s:8:\»interval\»;i:43200;}}s:16:\»wp_update_themes\»;a:1:{s:32:\»40cd750bba9870f18aada2478b24840a\»;a:3:{s:8:\»schedule\»;s:10:\»twicedaily\»;s:4:\»args\»;a:0:{}s:8:\»interval\»;i:43200;}}}s:7:\»version\»;i:2;}’ WHEREoption_name
= ‘cron’
3 Query SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = ‘_pingme’ LIMIT 1
3 Query DELETE FROM wp_postmeta WHERE post_id = 3 AND meta_key = ‘_pingme’
3 Query SELECT pinged FROM wp_posts WHERE ID = 3
3 Query SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = ‘_pingme’ LIMIT 1
3 Query DELETE FROM wp_postmeta WHERE post_id = 4 AND meta_key = ‘_pingme’
3 Query SELECT pinged FROM wp_posts WHERE ID = 4
3 Query SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = ‘_pingme’ LIMIT 1
3 Query SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = ‘_encloseme’ LIMIT 1
3 Query DELETE FROM wp_postmeta WHERE post_id = 3 AND meta_key = ‘_encloseme’
3 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (3)
3 Query SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = ‘_encloseme’ LIMIT 1
3 Query DELETE FROM wp_postmeta WHERE post_id = 4 AND meta_key = ‘_encloseme’
3 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (4)
3 Query SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = ‘_encloseme’ LIMIT 1
3 Query SELECT ID FROM wp_posts WHERE to_ping <> » AND post_status = ‘publish’
091104 20:10:26 2 Query SELECT * FROM wp_users WHERE user_login = ‘admin’
2 Query SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 1
2 Query SELECT option_value FROM wp_options WHERE option_name = ‘sidebars_widgets’ LIMIT 1
2 Query SELECT post_name FROM wp_posts WHERE post_name = ‘test-title’ AND post_type = ‘post’ AND ID != 0 LIMIT 1
2 Query SELECT post_name FROM wp_posts WHERE post_name = ‘test-title-2’ AND post_type = ‘post’ AND ID != 0 LIMIT 1
2 Query SELECT post_name FROM wp_posts WHERE post_name = ‘test-title-3’ AND post_type = ‘post’ AND ID != 0 LIMIT 1
2 Query INSERT INTOwp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-11-04 20:10:26′,’2009-11-04 17:10:26′,’test content’,»,’test title’,»,’publish’,’post’,’open’,’open’,»,’test-title-3′,»,»,’2009-11-04 20:10:26′,’2009-11-04 17:10:26′,’0′,’0′,’somethingsss’)
2 Query SELECT tr.term_taxonomy_id FROM wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (5) AND tt.taxonomy IN (‘category’)
2 Query SELECT * FROM wp_posts WHERE ID = 5 LIMIT 1
2 Query SELECT ID FROM wp_posts WHERE post_parent = 5
2 Query SELECT * FROM wp_posts WHERE ID = 5 LIMIT 1
2 Query INSERT INTOwp_postmeta
(post_id
,meta_value
,meta_key
) VALUES (‘5′,’1′,’_pingme’)
2 Query INSERT INTOwp_postmeta
(post_id
,meta_value
,meta_key
) VALUES (‘5′,’1′,’_encloseme’)
2 Query SELECT ID FROM wp_posts WHERE post_parent = 5
2 Query SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = ‘post’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’) ORDER BY wp_posts.post_date DESC LIMIT 0, 10
2 Query SELECT FOUND_ROWS()
2 Query SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN (‘category’, ‘post_tag’) AND tr.object_id IN (5, 4, 3) ORDER BY t.name ASC
2 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (5,4,3)
2 Query SELECT option_value FROM wp_options WHERE option_name = ‘kubrick_header_image’ LIMIT 1
2 Query SELECT option_value FROM wp_options WHERE option_name = ‘kubrick_header_color’ LIMIT 1
2 Query SELECT option_value FROM wp_options WHERE option_name = ‘kubrick_header_display’ LIMIT 1
2 Query SELECT * FROM wp_posts WHERE (post_type = ‘page’ AND post_status = ‘publish’) ORDER BY menu_order, post_title ASC
2 Query SELECT option_value FROM wp_options WHERE option_name = ‘page_for_posts’ LIMIT 1
2 Query SELECT YEAR(post_date) ASyear
, MONTH(post_date) ASmonth
, count(ID) as posts FROM wp_posts WHERE post_type = ‘post’ AND post_status = ‘publish’ GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC
2 Query SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN (‘category’) ORDER BY t.name ASC
2 Query SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN (‘link_category’) AND tt.count > 0 ORDER BY t.name ASC
2 Query SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = ‘Y’ AND ( tt.term_id = 2 ) AND taxonomy = ‘link_category’ ORDER BY link_name ASC
2 Quit
091104 20:10:27 3 QuitТеперь разбор полёта.
Было установленно соединение с mysql номер 2:
091104 20:10:25 2 Connect admin@localhost on
Следующие записи указывают, что был сделан один SELECT и один UPDATE:
2 Query SET NAMES utf8
2 Init DB wordpress
2 Query SELECT option_name, option_value FROM wp_options WHERE autoload = ‘yes’
2 Query UPDATEwp_options
SEToption_value
= ‘1257354625’ WHEREoption_name
= ‘_transient_doing_cron’Теперь начинается интересное. После последнего update-а, чего-то ему там не понравилось и он (движок wordpress-а) не завершив предыдущее соединение открывает ещё одно дополнительное соединение №3:
3 Connect admin@localhost on
3 Query SET NAMES utf8
3 Init DB wordpressДалее идут запросы третьего соединения в нормальном порядке и среди прочего одна вставка постинга в таблицу wp_posts:
3 Query INSERT INTO
wp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-11-04 20:10:25′,’2009-11-04 17:10:25′,’test content’,»,’test title’,»,’publish’,’post’,’open’,’open’,»,’test-title-2′,»,»,’2009-11-04 20:10:25′,’2009-11-04 17:10:25′,’0′,’0′,’somethingsss’)После того, как все запросы третьего соединения завершены, начинаются запросы второго соединения и среди прочего опять вставка постинга:
2 Query INSERT INTO
wp_posts
(post_author
,post_date
,post_date_gmt
,post_content
,post_content_filtered
,post_title
,post_excerpt
,post_status
,post_type
,comment_status
,ping_status
,post_password
,post_name
,to_ping
,pinged
,post_modified
,post_modified_gmt
,post_parent
,menu_order
,guid
) VALUES (‘1′,’2009-11-04 20:10:26′,’2009-11-04 17:10:26′,’test content’,»,’test title’,»,’publish’,’post’,’open’,’open’,»,’test-title-3′,»,»,’2009-11-04 20:10:26′,’2009-11-04 17:10:26′,’0′,’0′,’somethingsss’)Это и есть тот самый, назойливый, дублирующий, постинг.
Далее идут остальные запросы второго соединения а затем прекращение второго и третьего соединений с базой:
2 Quit
091104 20:10:27 3 Quit.
Единственная мысль, которая напрашивается, это то, что создаются два объекта wpdb, вместо одного.
А теперь вопрос как в «Что, Где, Когда»: почему создаются два объекта и как с эти бороться? Может это глюк какой-то?
эт помнится мне в wp-config можно включить режим отладки SQL запросов
а потом в конце работы можно будет их распечатать или wp-query или wpdb
где то там они будут по моему все таки wp_query
очень удобный лог там выдается мне очень помог когда тоСпасибо за помощь.
Пришлось сделать баг репорт и там получил ответ. При каждом вызове wp_insert_post() функция вносит в расписание пропинговку вставленного поста. При следующем рефреше запускается крон для пинговки, а так как wp_insert_post запускается при init хуке, то крон заново постит дублирующий пост. Если же wp_insert_post запускается без хука, т.е. в глобальном поле видимости, то и в этом случае крон будет запускать wp_insert_post заново.
Решение:
if(true === DOING_CRON)
return; // или другой код если в глобальном поле видимостиНадо бы это в доки приписать, чтобы народ зря время не терял на поиски ответов.
Подождите, Вы хотите сказать, что сделали так, чтобы пост создавался при каждом(!) обращении к движку? Не по таймеру, не по инициативе оператора, а просто по обращению? Это очень круто!
Для моей конкретной задачи таймер не подходит, инициатива оператора из того же раздела. Плагин будет запускаться с крона cPanel. init хук, разумеется, тоже не подходит. Может подскажите к какому хуку привязать? Я за wordpress неделю назад сел, не удивительно что не знаю.
Да при чем тут вордпресс, если сама логика «создания записи при любом обращении к сайту» ущербная? Так только системы сбора статистики посещений себя ведут. «Плагин будет запускаться с крона» — тоже глупость. Плагины запускают движком при каждом, опять же, обращении. Вы ж не просто записи создавать хотите, Вы же их еще и показывать собираетесь, да? Представляете, сколько всего нагенерится при посещении Вашего сайта поисковым ботом?
Вам нужно написать не плагин, а скрипт, который будет подключать движок через
require('wp-load.php');
, и используя функции движка, будет создавать записи. К тому же Вам нужно позаботиться, чтобы этот скрипт отличал штатный запуск хроном от запуска снаружи, во избежание «самопроизвольной» генерации постов.PS Кстати, а чем «таймер», который не подходит, отличается от «крона»?
Я с вами согласен, записи не будут создаваться при каждом посещении сайта. На данном этапе я пишу плагин и для тестирования мне требуется делать запись при каждом обновлении страницы. Конечный же продукт подразумевает привязку к определенному хуку, но пока я не определил к чему привязывать. Поэтому и попросил совета.
«Плагин будет запускаться с крона» = «скрипт, который будет подключать движок через require(‘wp-load.php’);», я не правильно сформулировал мысль, вы поправили. Тем не менее, скрипт подключающий движок должен запускать экшэн, в противном случае пхп ругается ворнингом на $wp_rewrite->feeds переменную, которая находится в wp-includes\post.php на 1779-й строке. Т.е. возвращаюсь к вопросу о привязке к подходящему хуку.
PS Кстати, а чем «таймер», который не подходит, отличается от «крона»?
имхо, таймер запускается при посещении сайта или админки, а так как плагин подкачивает контент из внешних ресурсов, то на это уходит много времени, следоветельно страница долго не будет отображаться.
- Тема «wp_insert_post() создаёт две записи в таблице вместо одной» закрыта для новых ответов.