Das Befüllen des Feeds um eine gewissen Verzögerung habe ich bereits vor langer Zeit erläutert, wobei im Grunde nur das SQL-Statement erweitert wird und um einen gewissen Zeitraum kann dann später im Feed publiziert werden und so bleibt Raum zu korrigieren.
Natürlich kann man diese Form der Spielereien beliebig betreiben und auch das Frontend später befüllen. Damit wird der Inhalt dem Leser erst nach einer gewissen Zeitspanne dargestellt. Ein kleines Scriptbeispiel soll zeigen, wie das geht.
Die Funktion kann beliebig erweitert werden, so zum Beispiel mit Abfragen zu Rechten der geloggten User abfragen oder vielfältige andere Anforderungen.
Im ersten Snippet wird die Ausgabe auf dem Frontend immer gefiltert, nur im Backend is_admin() und im Feed is_feed() bleibt alles unangetastet. Der Filter ist im Beispiel auf 15 Minuten gesetzt und diese Werden mit der Einstellung von WordPress abgeglichen, damit die Zeitzone beachtet wird. Die 15 Minuten werden in Sekunden umgerechnet und vom Wert abgezogen.
function publish_later_on_frontend( $where ) {
if ( is_admin() || is_preview() || is_feed() )
return $where;
$offset = 15; // minutes
$offset = ( get_option( 'gmt_offset' ) * 3600 ) - ( $offset * 60 ); // gmt offset of WP options minus custom time
$where .= " AND post_date < '" . gmdate( 'Y-m-d H:i:s', ( time() + $offset ) ) . "'";
return $where;
}
add_filter( 'posts_where', 'publish_later_on_frontend' );
Ein weiteres kurzes Beispiel erlaubt es allen geloggten Usern, die minimal die Rechte zum Lesen current_user_can('read') haben - also Abonnenten, die Inhalte zu lesen. Alle anderen Besucher bekommen die Inhalte 10 Tage später dargestellt.
function publish_later_on_frontend( $where ) {
if ( is_admin() || is_preview() || is_feed() || current_user_can('read') )
return $where;
$offset = 10; // days
$offset = ( get_option( 'gmt_offset' ) * 3600 ) - ( $offset * 24 * 60 * 60 ); // gmt offset of WP options minus custom time
$where .= " AND post_date < '" . gmdate( 'Y-m-d H:i:s', ( time() + $offset ) ) . "'";
return $where;
}
add_filter( 'posts_where', 'publish_later_on_frontend' );
Na - andere Ideen mit der Konstellation? Dann gern in die Kommentare oder via Link hierher verweisen. Ebenso freue ich mich, wenn es Verbesserungen am Code gibt; gerade im Bereich Rechnen mit Zeit gibt es ja viel Spielraum.
Kann man sehr gut einsetzen!
Hi Frank! Das ist praktisch! Damit kann man ja auch einen Memberbereich interessanter machen und trotzdem seine Posts irgendwann öffentlich machen. Die Passwortsperre von WP finde ich persönlich nämlich etwas altertümlich...
Danke für den schönen Beitrag!
define( MINUTE, 60 );
define( HOUR, 60*60 );
define( DAY, 24*60*60 );
define( WEEK, MONTH, YEAR, HALF_DAY, usw
Man macht sich die Arbeit leichter wenn man Zeiteinheiten gleich mal in verständlicher Sprache definiert. Dadurch wird der Code auch etwas besser lesbar da man besser versteht was mit "3600" gemeint ist.
Wirklich sehr nützlicher Artikel. Genau sowas habe ich für mein aktuelles Projekt gesucht.
DANKE
Gruß
Sandro
Schon wieder Code Arbeit, mag ich net so..:)
Dann schon lieber hier einfach mit Lesen....was es alles so gibt für WordPress das hört ja nimmer auf....
Schöner Blog, komme gerne wieder vorbei...
Boar diese Artikel mit Quellcode sind echt immer schwer zu lesen... aber du hast alles gut erklärt, es ist alles nachvollziehbar. Danke dafür, ich komme auch wieder!
Respekt! Da hat sich jemand Gedanken gemacht und diese TOP umgesetzt. Vielen Dank für diese Veröffentlichung. MfG
ui das hat was.... ich hab manchmal nachts anfälle von "schreibwut" und baller zig artickel raus und dann wieder ein paar wochen keine Lust. Da kommt das ja wie gerufen... So kann ich dann meinen Blog lebendiger gestallten und meine Leser denken nicht immer das ich i-wie schräg drauf bin
Das ist wirklich ein sehr schöner Artikel, das habe ich für mein Aktuelles Projekt gesucht.
Tausend dank dein Blog ist echt eine wahre Goldgrube..
Mach weiter so!!!
LG
Mark
Sehr interessant! Worin unterscheidet sich jetzt dein Code-Snippet von der Standard WP-Funktion der zeitversetzten Veröffentlichung?
@Rafael: dieser Content ist frei, nur nicht für alle Lesbar; er ist eine Basis für geschlossene Nutzergruppen etc.
Ich glaube nicht, dass das Sinn macht. Im Internet existiert keine Zeit.
aufjedenfall den Blog kann man wirklich weiter empfehlen... ein paar bekannte von mir haben sich auch schon sehr über den tip mit diesem blog gefreut
Ne wirklich witzige Idee. Aber noch eine weiter Optimierung zur Abfrage. Ralf hatte ja vorgeschlagen Konstanten zu definieren. Noch eleganter geht es direkt mit SQL. Es gibt nämlich ein Sprachkonstrukt
INTERVALdas hier super passt und die Sache noch leserlicher macht. Hier ein Beispiel:$where .= " AND post_date < NOW() - INTERVAL 5 MINUTE";
Wichtig ist hierbei, dass das Interval-Schlüsselwort immer im englischen Singular angegeben wird. Also z.B. "10 DAY" und nicht "10 DAYS". Das macht es natürlich auch einfacher dafür Variablen im Statement zu benutzen.
Außerdem hast du noch einen Fehler in deinem Code. Du musst natürlich von der aktuellen Uhrzeit die Minuten abziehen und nicht aufaddieren.
Eine weiter Vairante funktioniert mit strtotime() und sieht wie folgt aus:
$where .= " AND post_date < FROM_UNIXTIME(" . strtotime("-5 day"). ")";
Beide Varianten machen das Ganze viel leserlicher, wobei ich ein großer Fan von INTERVAL in SQL-Statements geworden bin.
@Kau-Boy: vielen Dank für diese Tipps - schaue ich mir gern an.
Wie immer ein Vergnügen zu lesen! Ich werde auf dich zu neuen Artikeln warten! Vielen Dank! fügen Sie Ihren Blog zu Ihren Lesezeichen
@Fischefänger: "Im Internet existiert keine Zeit." Das ist gut, muss ich mir merken. Aber leider ist dem nicht so. Ein gutes Beispiel dafür sind die Angebote der öffentlich rechtlichen Sendeanstalten, die ja leider Dinge nach 1-2 Jahren (manchmal schon nahc einer Woche) "depublizieren" müssen. Aber die beschriebene Funktion macht durchaus Sinn, wenn auch nicht für jeden Blog.
@Kau-Boy:
So lange man seinen eigenen SQL-Server hat, ist dein Tipp nicht schlecht. Ich würde bei WordPress aber möglichst wenig in das SQL-Statement packen. WP läuft häufig auf Shared Hosts und da weiß man nicht ob man mit solchen SQL-Konstrukten nicht das Kind mit den Bade ausschüttet.
Deswegen bin ich ein großer Fan davon alles im PHP-Script klar und deutlich zu definieren und klare Anweisungen (an den SQL-Server) zu übergeben.
Das sind aber zwei Philosophien die jeder nach seinem Gusto vertreten kann
@Fischefänger:
Mag sein das es im Internet keine Zeit gibt. Aber das ist auch uninteressant. Denn maßgeblich sind die Nutzer des Internets und bei denen ist Zeit sehr wohl existent.
Rein von der Semantik her würde ich sagen, fehlt noch der Hinweis, dass diese Funktion wahrscheinlich dann in die functions.php muss? Und wenn man den Code anwenden will auf die Einträge? Muss man dann eine IF-Abfrage mit der Funktion um den Loop machen?
@Alexander: Ich bin in der Regel eher für ein Plugin, als Theme - da dies für die Gestaltung da ist, nicht für Funktionen, die unabhängig vom Layout laufen. Prinzipiell geht die functions.php des Themes, aber beim Themewechsel, Problemen etc. ist die Funktion weg. Die if-Abfrage ist nicht notwendig, der Hook von WP greift auf den Loop und damit greift das Stück Source überall, wenn man es nicht in der Funktion ausschließt, wie bspw. das Backend mit
is_admin().@Alexander:
In die functions.php würde ich so gut wie gar nichts mehr rein packen. Es schreibt sich zwar so leicht (pack den Code einfach in die functions.php), hat aber so seine Tücken.
Auf meiner lokalen Installation hatte ich ein paar Codeschnipsel in der functions.php. War ja alles nur zum testen und muss ja immer schnell gehen, nehme ich halt das Standard-Theme. Dann kam das Update zu 3.1. Ist ja alles nur lokal, was soll schon schief gehen. Backup? Ach, Zeitverschwendung!
Na ja, nach dem Backup habe ich dann wie doof nach meinen Codeschnipseln gesucht, die wurden nämlich mit dem Backup ohne Vorwarnung überschrieben.
Jetzt habe ich ein kleines Plugin das mir quasi meine eigene functions.php beim Start inkludiert:
add_action ( 'init', 'my_hacks_include' );function my_hacks_include() {
include_once $path . '/my_hacks.php';
}
$pathist der Pfad zu der entsprechenden Datei. Da kann man sich ja was nach seinem Gusto aussuchen. Entweder im Theme-Ordner, im Plugins-Ordner oder direkt in wp_content.Wenn man die Hooks nutzt, ist man zudem noch flexibler wann bzw. wo man die Datei einbindet als nur mit der functions.php. Man kann auch noch eine andere Datei einbinden die z.B. nur im Backend aktiv ist und spart sich damit die is_admin-Abfragen.
Das "Dieser Code gehört in die functions.php" sollte man sich so langsam mal abgewöhnen, ausgenommen man schreibt gerade ein Theme. Die Faustregel lautet: Wer ein Theme schreibt, nutzt die functions.php. Wer ein bestehendes (fremdes) Theme um Funktionalität erweitern will, nutzt Plugins.
Hi Frank,
ich hatte nach einer Möglichkeit gesucht, wie ich Inhalte, die nur eingeloggt für den Leser sichtbar sind, nach einem Monat veröffentlichen kann - aber dann auch mit dem aktuellen Datum, erst dann in den normalen Rss-Feed usw.
Ich wollte nämlich vermeiden, dass wenn Leute den Feed abonniert haben oder regelmäßig auf die Seite kommen, den Text dann nicht mehr sehen, weil er ja quasi in der klassischen Blog-Timeline verschwindet.
Wenn ich jetzt dein zweites Beispiel nehme, kann ich dann genau das bewirken?
(oder denke ich jetzt zu kompliziert?)
Danke auf jeden fall schon mal für den Tipp, ich werde das heute abend einfach mal ausprobieren.
@Borko: ja, der Code macht dies, wobie das is_feed() raus muss, sonst ist es direkt im Feed; wenn nur is_admin() und is_preview() darin läßt, dann lesen die freien Leser erst, wenn der Zeitraum rum ist.
Vielen Dank
Sehr sinnvolle Sache, das werde ich doch gleich mal ausprobieren.
Tja , gelernt ist eben gelernt. Ich wünschte ich hätte auch so viel Ahnung von der Materie und könnte schön Coden und klein Scripte schreiben...
Bin begeistert! Wusste zwar das es geht, hatte bisher nur bei all meinen versuchen immer einen fehler dabei, nun ist mir Lösung quasi auf dem goldenen Teller serviert worden !!! Danke! Das sparrt mir Stunden!
Die zeitversetzte Veröffentlichung nach bestimmten User-Gruppen wie "ucurrent_user_can('read')" ist ein guter Tipp. Meiner Meinung nach würde WP ohnehin eine verbreiterte Rechtevergabe und verbesserte Veröffentlichungs-Filter gut zu Gesicht stehen (wie z.B. bei Joomla - auch wenn das andere Zielgruppen hat).
Danke für die gute Anleitung. Meine Frage: Kann man irgendwie zusätzlich erreichen, dass die Inhalte zeitversetzt für verschiedene Nutzergruppen veröffentlicht werden? Also Gruppe 1 bekommt den Inhalt z. B. 6 Stunden früher als Gruppe 2?
@Till: sicher, die Funktion kann beliebig erweitert werden
Kann man dieses Feature auch für mehr als 2 Nutzergruppen verwenden?
Die Idee, bestimmte Artikel für Abonnenten sofort zur Verfügung zu stellen und für alle normalen Besucher erst einige Zeit später zu veröffentlichen, ist ziemlich gut. Da findet sich doch sicher ein gutes Einsatzgebiet dafür, danke dir!
Sicher sehr sinnvoll, wenn man einen gut laufenden Blog hat, und man in Urlaub fahren will o.ä. Für meine eigenen Blogs eher uninterssant, weil es keiner Sauf auffallen würde, wenn mal 1 Monat nix neues geschrieben wird xD
Habe es kurz getestet, aber wir bereits oben erwähnt..da sollte der Blog schon sehr gut laufen.
Cool, da hat sich mal jemand etwas richtig sinnvolles ausgedacht. Danke schön, das werde ich wohl gleich mal austesten.
Vielen Dank! Danach habe ich schon länger gesucht. Zwar lassen sich Artikel gut in WordPress vorbereiten. Für den letzten Schliff muss ich aber oft doch veröffentlichen. Da passt es super, wenn die Änderungen für den Leser eine Zeit lang nicht sichtbar sind.
Auf welche Inhalte genau wirkt sich der Code aus. Nur auf neue Artikel und Seiten oder auch auf Änderungen? Z.B. Erweiterungen von Artikeln, Umsortierungen in andere Kategorien...?
@Tobias: es geht hier nur um den Query, damit sind Artikel und Seiten darin, wenn man Custom Post Types nutzt, dann auch diese.
Hallo, vielen Dank!
Bei neu erstellten Artikeln funktioniert es perfekt!
Was muss ich tun, damit es auch funktioniert, wenn ich einen vorhandenen Artikel aktualisiere? Ich habe meine Artikel auf der Startseite nämlich nach last modified sortiert.
@Gabriel: einfach via wp_update_post machen
Bin über google hierher gekommen. Habe genau sowas gesucht über den Content zeitversetzt zu posten. Habs eben gleich mal probiert und getestet und es klappt auf Anhieb (obwohl ich gar kein PHP Profi bin)
Super! Danke dafür. Muss ich gleich mal weiter stöbern bei den WordPress Snippets
LG
Andy