Hur skapar man en sida med arkiv (sammanfattning) för alla WordPress-inlägg/sidor med PHP?
Jag har precis skapat två sammanfattningssidor för mina två bloggar: https://helloacm.com/archives-of-pagesposts/ och http://www.codingforspeed.com/archives-of-pagesposts/.
På båda sidorna är alla artiklar (inklusive sidor) sorterade efter månader. Antalet kommentarer för varje inlägg kommer att räknas och skrivas ut efter inläggets rubrik inom parentes.
Detta kan vara bra att lista alla artiklar/sidor för användare och för sökmotorer också, så den här sidan fungerar också som en webbplatskarta.
Som du kan se på sammanfattningssidan skriver den först ut det totala antalet inlägg/sidor, och för varje månad (endast om det finns minst ett inlägg/sida publicerad den månaden) genererar den indragna länkar.
Så, hur ska vi uppnå detta? Först och främst, inom WordPress, skulle du behöva några plugins för att kunna inkludera PHP-kod i inlägg/sidor. Gå till kontrollpanelen för wordpress efter att du loggat in och navigera till Plugins och "Lägg till nytt". Sök på ’Inkludera PHP’ så hittar du många alternativ.
Kopiera sedan och klistra in följande PHP-kod i en enda PHP-fil, under temarotkatalogen.
// <a class="vglnk" target="_blank" href="http://helloacm.com" rel="nofollow"><span>helloacm</span><span>.</span><span>com</span></a>
global $wpdb;
$query = "select count(1) from `wp_posts` where (post_type = 'page' or post_type = 'post') and `post_status` = 'publish'";
$total = $wpdb->get_var($query);
echo "<h2>Archives</h2>";
$query = "select concat(year(`post_date`), '-', month(`post_date`)) as `month`, count(1) as `cnt` from `wp_posts` where (post_type='page' or post_type='post') and `post_status` = 'publish' group by `month` order by `post_date` desc";
$result = $wpdb->get_results($query);
echo "<ul>";
if ($result) {
foreach ($result as $month) {
echo "<li>".$month->month." (".$month->cnt.")</li>";
$m = explode('-', $month->month);
$y = $m[0];
$m = $m[1];
$q = "select `post_name`, `post_title`, day(`post_date`) as `day`, `id` from `wp_posts` where (post_type='page' or post_type='post') and `post_status` = 'publish' and month(`post_date`)='$m' and year(`post_date`)='$y' order by `post_date` desc";
$r = $wpdb->get_results($q);
if ($r) {
echo "<ul>";
foreach ($r as $post) {
$cnt = $wpdb->get_var("select count(1) from `wp_comments` where `comment_approved`=1 and `comment_post_ID` = ".$post->id);
if (!$cnt) $cnt = 0;
echo "<li>".$post->day.": <a title='".htmlentities($post->post_title, ENT_QUOTES)."' href='<a class="vglnk" target="_blank" href="https://helloacm.com/".$post-" rel="nofollow"><span>https</span><span>://</span><span>helloacm</span><span>.</span><span>com</span><span>/".$</span><span>post</span><span>-</span></a>>post_name."/'>".$post->post_title."</a> ($cnt)</li>";
}
echo "</ul>";
}
}
}
echo "</ul>";
Algoritmen här är att gruppera efter år-månad i SQL och loop varje månad, och få alla inlägg/sidor för den månaden. Använd den globala variabeln $wpdb för att köra SQL-satsen. Använd get_var för SQL-satser med en variabel som select count(1) och använd get_results för flera rader.
Ändra wordpress -tabellnamnet wp_posts om prefixet inte är wp_. Däremot kan du använda $wpdb->posts för att få namnet på inläggstabellen, vilket är en bättre metod. Filtrera inläggen/sidorna genom att ändra motsvarande SQL-satser (där orsak) i enlighet därmed.
Dessutom räknas Facebook-gilla-markerna och ingår också i parentes. För att göra detta måste du skapa en annan tabell som har nyckelparet för artikel-id och likes-nummer. Du kommer att behöva ställa in en crontab som körs kanske en gång i timmen för att uppdatera facebook-gilla-markeringarna (eller andra sociala nätverk) för varje inlägg. Detta kommer att behandlas i en annan separat handledning.