Запуск wp-плагина по Cron

123 4
MB
На сайте с 24.02.2009
Offline
177
642
Всем привет!
Есть у меня такой замечательный плагин, который создаёт карту сайта и разбивает её на несколько карт сайта объединяя их в индексном сайтмапе.
Но он не может запускаться по крону, как сделать так, чтобы он запускался по крону? Надо запускать раз в три часа.
<?php
/*
Plugin Name: Massive Sitemap Generator
Plugin URI: http://plugins.svn.wordpress.org/massive-sitemap-generator/
Description: Create sitemaps for websites that have over 50,000 pages and posts to be indexed by Google Webmaster Tools
Version: 0.1.2
Author: thepauleh
Author URI: http://paulsellars.com
 */
 
/**
 * @author P.Sellars
 */
class massive_sitemap_generator {
    private static $_instance;
    private function __construct(){
        if($_GET['GO']){
                        require_once("sitemap_generator.php");
            $split = sitemap_generator::Create();
                        echo $this->show_admin_panel($split);
        }
                else{
        echo $this->show_admin_panel();
                }
    }
    public static function Create(){
        if(!isset(self::$_instance)){
                $className = __CLASS__;
                self::$_instance = new $className;
            }
        return self::$_instance;
    }
    public static function get_menu(){
    add_options_page( 'Massive Sitemap Generator', 'Massive Sitemap Generator', 'manage_options', 'massive-sitemap-generator', array('massive_sitemap_generator', 'Create'));
    }
    /**
     * Display the admin panel 
     */
    private function show_admin_panel($split = null){
        $output = "<h2>Massive Sitemap Generator</h2>
            <p>
            Your Upload Directory is: https://mysite.com/sitemap/<br /><br />
            Please ensure this is writeable by the webserver.<br /><br />
            Files will be placed here by the name of sitemap0.xml, incrementing in the style of
            sitemap1.xml.<br />
            </p>";
        if(!$_GET['GO']){
            $output .= "<p>
            Ready? Press Go to run the generator.
            <form action='' method='GET'>
            <input type='hidden' name='page' value='massive-sitemap-generator' />
            <input type='hidden' name='GO' value='true' />
            <input type='submit' value='Go!' /></p>";
        }
        else{
            $output .= "<b>Thankyou, the sitemap generator has been executed.</b><br />
                        <br />
                        Sitemaps: UPDATED!";
                        if($split){
$text = '<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
for($i = 0; $i <= $split; $i++){$data=gmdate("Y-m-d");
$text .= "<sitemap>
<loc>http://mysite.com/sitemap/part".$i.".xml</loc>
<lastmod>$data</lastmod>
</sitemap>\n";
}
$text .= "</sitemapindex>";
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/sitemap.xml', $text);
                        }
        }
        return $output;
    }
}
add_action( 'admin_menu', array('massive_sitemap_generator','get_menu') );
?>

<?php
/**
 * Description of sitemap_generator
 *
 * @author P.Sellars
 */
class sitemap_generator {
    const limit = 3000;
    public static function Create(){
        $counter = self::get_count();
        $split = ($counter / self::limit);
        self::fetch_records($split);
                return $split;
    }
    /**
     * Get the total number of posts and pages to be displayed 
     */
    public function get_count(){
        global $wpdb;
        $sql = "SELECT count(ID) from `{$wpdb->prefix}posts` WHERE `post_status` = 'publish'";
        return $wpdb->get_var($sql);
    }
    public function fetch_records($split){
        global $wpdb;
        for($i = 0; $i <= $split; $i++){
            $lowLimit = ($i * self::limit);
            $sql = "SELECT left(post_modified_gmt,10) as `date`, post_name FROM {$wpdb->prefix}posts WHERE `post_status` = 'publish' LIMIT {$lowLimit},".self::limit;
            $item = $wpdb->get_results($sql);
            self::create_sitemap($item, $i);
        }
    }
public function create_sitemap($item, $sitemap){
$output = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
foreach($item as $myitem){
$output .= "<url>
<loc>https://mysite.com/{$myitem->post_name}/</loc>
<lastmod>{$myitem->date}</lastmod>
</url>\n";
}
$output .= "</urlset>";
self::public_sitemap($output, $sitemap);
}
public function public_sitemap($data, $sitemap){
file_put_contents($_SERVER['DOCUMENT_ROOT']."/sitemap/part{$sitemap}.xml", $data);
}}
?>

SA
На сайте с 12.04.2024
Offline
37
#1
Зайди на хостинг, выбери крон, укажи путь к скрипту. Там же есть все настройки когда и на сколько запускать.
MB
На сайте с 24.02.2009
Offline
177
#2
SeoA #:
Зайди на хостинг, выбери крон, укажи путь к скрипту. Там же есть все настройки когда и на сколько запускать.
Попробовал так прописать

wget -O /dev/null -q http://mysite.com/wp-admin/options-general.php?page=massive-sitemap-generator&amp;GO=true

Судя по логу задание срабатывает, но плагин не запускается, если просто перейти по этой ссылке кидает на страницу авторизации wp, а вот если залогиниться то тогда ссылка срабатывает, но как заставить крон работать по не залогиненой ссылке?

SA
На сайте с 12.04.2024
Offline
37
#3
Права доступа на файл измени
SA
На сайте с 12.04.2024
Offline
37
#4
SeoA #:
Права доступа на файл измени

Если не получится, то надо поменять эту строчку

add_action( 'admin_menu',.....
W1
На сайте с 22.01.2021
Offline
306
#5
SeoA #:
Права доступа на файл измени

На какой файл и каким боком тут права доступа?

SeoA #:
Если не получится

Так получится или не получится? А если и по второму варианту не получится?

Полагаю, что ни так, ни эдак не получится. Даже и пытаться это обсуждать не стоит.

Мой форум - https://webinfo.guru –Там я всегда на связи
VMx-Mx
На сайте с 02.09.2020
Offline
35
#6

Как вариант, записывать в БД время последнего обновления, затем сверять, сколько времени прошло (будет срабатывать при каждой загрузке страниц сайта) и запускать нужную функцию через нужный промежуток времени.

Например так:

$interval = 3600;
$update_time = $wpdb->get_var("здесь указать нужную ячейку");
$current_time = date('Y-m-d H:i:s');
$difference = strtotime($current_time) - strtotime($update_time);
if ($update_time == null || $вifference >= $interval)
{
выполнить функцию...
}
W1
На сайте с 22.01.2021
Offline
306
#7
VMx-Mx #:
Как вариант

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

A6
На сайте с 21.04.2024
Offline
0
#8

Дописать в massive-sitemap-generator.php:

// При активации плагина
function activate_sitemap_generator() {
	// Создание задачи cron (hourly - ежечасно, twicedaily - дважды в день, daily - ежедневно)
	wp_schedule_event(strtotime('06:00:00'), 'hourly', 'sitemap_generator_cron');
}
register_activation_hook( __FILE__, 'activate_sitemap_generator' );

// При деактивации плагина
function deactivate_sitemap_generator() {
	// Удаление задачи cron
	wp_clear_scheduled_hook('sitemap_generator_cron');
}
register_deactivation_hook( __FILE__, 'deactivate_sitemap_generator' );

// Выполнение задачи cron
add_action('sitemap_generator_cron', function() {
        require_once('sitemap_generator.php');
	$sitemaps = new sitemap_generator;
	$sitemaps->Create();
}); 
VMx-Mx
На сайте с 02.09.2020
Offline
35
#9
webinfo #:

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

Я и написал как. Не совсем cron, поэтому и добавил "как вариант".

W1
На сайте с 22.01.2021
Offline
306
#10
VMx-Mx #:
Я и написал как.

Нет. То, что написано, это "когда". А "как" - это вместо фразы "выполнить функцию.." написать более или менее конкретный код. Типа того, что написал andrey6. У ТС проблема именно в запуске плагина с учётом авторизации. А не вот это вот:

VMx-Mx #:
запускать нужную функцию через нужный промежуток времени

Проблема именно в написании упомянутой "нужной функции".

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий