Поддержка Проблемы и решения 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′,»)

    Данная команда прослушивается в переменной, как и полагается, один раз. Однако, в базе создаются две идентичные записи, вместо одной. Предположительно вторая запись создаётся ещё где-то.

    Помощь треба, буду очень признателен.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Забыл приписать: переменная файле wp-includes/wp-db.php на 678-й строке это $query.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Пока не удалось воспроизвести — на тестовом блоге скрипт создаёт только одну запись.

    Я сделал короткую видеозапись. Пожалуйста просмотрите. При первом постинге создаются две записи, при втором — одна. Причем при первом постинге php ругается на значение переменной NULL, тогда как во второй раз, при том же значении Warning уже не выдаёт. Это уже другая переменная — $wp_rewrite->feeds и находится в wp-includes\post.php на 1779-й строке. Может в ней всё дело?

    Youtube video

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Так нагляднее 🙂 Нужно связать создание записи с одним из встроенных действий — например, 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 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 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 INTO wp_postmeta (post_id,meta_value,meta_key) VALUES (‘3′,’1′,’_pingme’)
    1 Query INSERT INTO wp_postmeta (post_id,meta_value,meta_key) VALUES (‘3′,’1′,’_encloseme’)
    1 Query UPDATE wp_options SET option_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;}’ WHERE option_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) AS year, MONTH(post_date) AS month, 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 UPDATE wp_options SET option_value = ‘1257354625’ WHERE option_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 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’)
    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 INTO wp_postmeta (post_id,meta_value,meta_key) VALUES (‘4′,’1′,’_pingme’)
    3 Query INSERT INTO wp_postmeta (post_id,meta_value,meta_key) VALUES (‘4′,’1′,’_encloseme’)
    3 Query SELECT ID FROM wp_posts WHERE post_parent = 4
    3 Query UPDATE wp_options SET option_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;}’ WHERE option_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 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 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 INTO wp_postmeta (post_id,meta_value,meta_key) VALUES (‘5′,’1′,’_pingme’)
    2 Query INSERT INTO wp_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) AS year, MONTH(post_date) AS month, 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 UPDATE wp_options SET option_value = ‘1257354625’ WHERE option_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; // или другой код если в глобальном поле видимости

    Надо бы это в доки приписать, чтобы народ зря время не терял на поиски ответов.

    Модератор Юрий

    (@yube)

    Подождите, Вы хотите сказать, что сделали так, чтобы пост создавался при каждом(!) обращении к движку? Не по таймеру, не по инициативе оператора, а просто по обращению? Это очень круто!

    Для моей конкретной задачи таймер не подходит, инициатива оператора из того же раздела. Плагин будет запускаться с крона cPanel. init хук, разумеется, тоже не подходит. Может подскажите к какому хуку привязать? Я за wordpress неделю назад сел, не удивительно что не знаю.

    Модератор Юрий

    (@yube)

    Да при чем тут вордпресс, если сама логика «создания записи при любом обращении к сайту» ущербная? Так только системы сбора статистики посещений себя ведут. «Плагин будет запускаться с крона» — тоже глупость. Плагины запускают движком при каждом, опять же, обращении. Вы ж не просто записи создавать хотите, Вы же их еще и показывать собираетесь, да? Представляете, сколько всего нагенерится при посещении Вашего сайта поисковым ботом?

    Вам нужно написать не плагин, а скрипт, который будет подключать движок через require('wp-load.php');, и используя функции движка, будет создавать записи. К тому же Вам нужно позаботиться, чтобы этот скрипт отличал штатный запуск хроном от запуска снаружи, во избежание «самопроизвольной» генерации постов.

    PS Кстати, а чем «таймер», который не подходит, отличается от «крона»?

    Я с вами согласен, записи не будут создаваться при каждом посещении сайта. На данном этапе я пишу плагин и для тестирования мне требуется делать запись при каждом обновлении страницы. Конечный же продукт подразумевает привязку к определенному хуку, но пока я не определил к чему привязывать. Поэтому и попросил совета.

    «Плагин будет запускаться с крона» = «скрипт, который будет подключать движок через require(‘wp-load.php’);», я не правильно сформулировал мысль, вы поправили. Тем не менее, скрипт подключающий движок должен запускать экшэн, в противном случае пхп ругается ворнингом на $wp_rewrite->feeds переменную, которая находится в wp-includes\post.php на 1779-й строке. Т.е. возвращаюсь к вопросу о привязке к подходящему хуку.

    PS Кстати, а чем «таймер», который не подходит, отличается от «крона»?
    имхо, таймер запускается при посещении сайта или админки, а так как плагин подкачивает контент из внешних ресурсов, то на это уходит много времени, следоветельно страница долго не будет отображаться.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Тема «wp_insert_post() создаёт две записи в таблице вместо одной» закрыта для новых ответов.