Ответы в темах

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • К сожалению предложенный вами вариант не работает.

    Под синтаксисом я подразумевал синтаксис самого WordPress-а. Конечная строка ‘activate_akismet/akismet.php’ поставила меня в тупик. WordPress понимает такие директивы?

    В моём случае обновление должно происходить без клика.

    Спасибо за ответ, но пока до конца не вник…

    Вы уверены относительно правильности синтаксиса последней строчки?
    do_action("activate_<strong>$plugin</strong>");

    Есть хук, который можно проинклудить и активировать плагин:

    if(!function_exists(activate_plugin))
    include_once(ABSPATH.'wp-admin/includes/plugin.php');
    
    activate_plugin(WP_PLUGIN_DIR.'/'.$pluginName);

    Однако, ваше решение видится более элегантным, единственное что мне непонятно, это синтаксис последней строки. Поясните пожалуйста.

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

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

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

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

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

    Спасибо за помощь.

    Пришлось сделать баг репорт и там получил ответ. При каждом вызове wp_insert_post() функция вносит в расписание пропинговку вставленного поста. При следующем рефреше запускается крон для пинговки, а так как wp_insert_post запускается при init хуке, то крон заново постит дублирующий пост. Если же wp_insert_post запускается без хука, т.е. в глобальном поле видимости, то и в этом случае крон будет запускать wp_insert_post заново.

    Решение:

    if(true === DOING_CRON)
    return; // или другой код если в глобальном поле видимости

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

    Пришлось покопаться в логах 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, вместо одного.

    А теперь вопрос как в «Что, Где, Когда»: почему создаются два объекта и как с эти бороться? Может это глюк какой-то?

    Пхп уже не ругается, это плюс. Но в этот раз двойной пост создался на второй попытке refresh-а. Может надо привязать к другому действию?

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

    Youtube video

    Забыл приписать: переменная файле wp-includes/wp-db.php на 678-й строке это $query.

Просмотр 10 ответов — с 1 по 10 (всего 10)