Wie erstelle ich ein anpassbares Widget mit zufälligen Beiträgen aus meinem Blog, die auf einer anderen Website als js, iframe oder div veröffentlicht werden können? Gibt es dafür ein Wordpress-Plugin?
So erstellen Sie eine spezielle Ausgabe von zufälligen Beiträgen:
'template_redirect'
ein und geben Sie Ihre Ausgabe abhängig von den Details des angeforderten Endpunkts zurück. Dann exit
.Das ist alles.
Nun ... ein bisschen Code kann helfen, die Details zu verstehen. :)
Erstellen wir ein kleines Plugin für die HTML- und JSON-Ausgabe.
Ich habe es benannt T5 Random Posts Endpoint ; Der gesamte Code wird mit statischen Methoden in eine Klasse eingeteilt, um den globalen Namespace sauber zu halten.
add_action( 'init', array ( 'T5_Random_Posts_Endpoint', 'init' ) );
/**
* Build a root endpoint.
*/
class T5_Random_Posts_Endpoint
{
/**
* Register endpoint and actions.
*
* @wp-hook 'init'
* @return void
*/
public static function init()
{
add_rewrite_endpoint( 'randomposts', EP_ROOT );
add_filter( 'request', array ( __CLASS__, 'filter_request' ) );
add_action( 'template_redirect', array ( __CLASS__, 'render' ) );
}
}
Wie Sie sehen, rufen wir auf 'init'
eine zentrale init
-Methode auf, um… unser Plugin zu initialisieren. Kreative Namensgebung, oder?
Der Endpunkt heißt randomposts
und ist mit dem Stamm verbunden. Nach der Aktivierung können Sie also den example.com/randomposts/
oder example.com/randomposts/json/
ausgeben.
Aber ... wenn Sie die erste URL aufrufen, funktioniert der Endpunkt und die Anforderungsvariable randomposts
ist gesetzt - aber sie ist leer . Deshalb binden wir uns in 'request'
ein und geben der Variablen einen Standardwert , mit dem wir später arbeiten können. Verwenden wir html
als Standard:
/**
* Prepare the endpoint variable so it has always a value.
*
* @wp-hook 'request'
* @param array $request
* @return array
*/
public static function filter_request( $request )
{
if ( isset ( $request['randomposts'] )
and empty ( $request['randomposts'] )
)
{
$request['randomposts'] = 'html';
}
return $request;
}
Jetzt binden wir uns in 'template_redirect'
ein, damit WordPress nicht die Standardvorlage index.php
verwendet, sondern unsere eigene Ausgabe.
/**
* Create output.
*
* @wp-hook 'template_redirect'
* @return void
*/
public static function render()
{
// This is not our endpoint.
if ( '' === $type = get_query_var( 'randomposts' ) )
{
return;
}
// Someone is poking around.
// You can extend this and build different output variants.
if ( ! in_array( $type, array ( 'html', 'json' ) ) )
{
status_header( 414 );
print 'Unsupported Media Type. Use "html" or "json" only.';
exit;
}
// Empty blog?
if ( ! $posts = get_posts( array ( 'numberposts' => 10, 'orderby' => 'Rand' ) ) )
{
status_header( 404 );
print 'No posts found.';
exit;
}
self::$type( self::prepare_post_data( $posts ) );
exit;
}
Zuerst überprüfen wir, ob wir wirklich an unserem Endpunkt sind, indem wir uns mit get_query_var( 'randomposts' )
befassen. Wir haben diese Variable in unseren Anforderungsfilter eingetragen. Wenn sie also noch leer ist, wissen wir , dass das nicht unsere Sache ist, und kehren schnell zurück.
Dann testen wir, ob die Anfrage für eine unserer vordefinierten Ausgabevarianten html
oder json
war. Wenn jemand /randomposts/css
oder /randomposts/lala
anruft, wird ein 414-Fehler mit einer hilfreichen Nachricht ausgegeben. Und raus.
Dann bekommen wir endlich unsere Posts mit get_posts()
und entfernen alle Daten, die wir nicht brauchen, in einer speziellen Methode namens prepare_post_data()
:
/**
* Build a simple array with just titles and permalinks.
*
* @wp-hook 'template_redirect'
* @param array $posts
* @return void
*/
protected static function prepare_post_data( $posts )
{
$data = array ();
foreach ( $posts as $post )
{
if ( empty ( $post->post_title) )
{
continue;
}
$data[ $post->ID ] = array (
'title' => strip_tags( $post->post_title ),
'url' => get_permalink( $post->ID )
);
}
return $data;
}
Wir übergeben dieses einfache Array an eine Methode, die genau wie unsere Ausgabe benannt ist: html()
oder json()
.
Beginnen wir mit json()
; Das ist der einfache Teil. Unter Wie codiere ich Post-Inhalte als JSON? finden Sie Hintergrundinformationen.
/**
* Render JSON output
*
* @wp-hook 'template_redirect'
* @param array $data
* @return void
*/
protected static function json( array $data )
{
header( 'Content-type: application/json' );
print json_encode( $data );
}
Einfach, nicht wahr? Die html()
ist nicht viel schwieriger, nur länger:
/**
* Render HTML output
*
* @wp-hook 'template_redirect'
* @param array $data
* @return void
*/
protected static function html( array $data )
{
?>
<!doctype html>
<title><?php bloginfo( 'name' ); ?></title>
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<?php
// Just a sample style. Be creative! :)
?>
<style>
body, body *
{
display: block;
font: 1em/1.4 Calibri, sans-serif;
list-style: none;
margin: 0;
padding: 0;
text-decoration: none;
}
a
{
background: #f5f5f5;
border-bottom: 1px solid #ddd;
color: #333;
padding: 5px 10px;
}
a:hover, a:focus
{
background: #333;
color: #f5f5f5;
}
h1 a
{
font-size: 1.2em;
font-weight: bold;
}
</style>
<h1><a href="<?php bloginfo( 'url' ); ?>"><?php bloginfo( 'name' ); ?></a></h1>
<ul>
<?php
foreach ( $data as $post )
{
print '<li><a href="' . $post['url'] . '">' . $post['title'] . '</a></li>';
}
?>
</ul>
<?php
}
So sieht es mit den Theme-Testdaten aus :
Jetzt ist unsere Ausgabe beendet - wir befinden uns noch in render()
- und wir rufen exit
auf, da WordPress andernfalls den index.php
aus dem aktiven Thema einschließen würde.
Jetzt brauchen wir nur noch eine Methode, um die Permalink-Einstellungen zu aktualisieren:
/**
* Reset permalinks.
*
* @wp-hook 'activate_' . __FILE__
* @wp-hook 'deactivate_' . __FILE__
* @return void
*/
public static function flush_rewrite_rules()
{
remove_action( 'init', array ( __CLASS__, 'init' ) );
add_action( 'init', 'flush_rewrite_rules', 11 );
}
Wir verhindern hier unseren Standard-Hook für init
, da wir uns bei der Aktivierung in der Plugin-Liste befinden, in der wir den Endpunkt nicht benötigen, und bei der Deaktivierung den jetzt nicht verwendeten Permalink nicht erneut registrieren möchten.
Wir fügen diese Methode der (De-) Aktivierung bei mit:
// refresh permalink settings
register_activation_hook(
__FILE__ ,
array ( 'T5_Random_Posts_Endpoint', 'flush_rewrite_rules' )
);
register_deactivation_hook(
__FILE__ ,
array ( 'T5_Random_Posts_Endpoint', 'flush_rewrite_rules' )
);
Und jetzt können wir sagen: Das ist alles. Ja wirklich.
Wenn du es soweit geschafft hast, nimm das komplette Plugin von GitHub.
Ich denke, im Wesentlichen geht es um ein benutzerdefiniertes Widget, das RSS-Feeds Ihres Blogs analysiert und anzeigt. Hier können Sie ein eigenes benutzerdefiniertes Widget erstellen und die RSS-Feed-URL Ihres Blogs in Ihrem Widget PHP selbst fest codieren, um sicherzustellen, dass der Widget-Benutzer die URL nicht ändert. Daher zeigt Ihr Widget nur RSS Ihres Blogs an.
Sobald Sie sich für die Verwendung von RSS zum Verzweigen Ihres Blogs entschieden haben, stehen Ihnen mehrere Optionen zur Verfügung. Entweder können Sie Wordpress-eigene RSS-Feed-Funktionen verwenden, um Zeit zu sparen (dies bringt jedoch viele Einschränkungen mit sich). OR Schreiben Sie Ihren eigenen RSS-Feed-Herstellercode als Webdienst, der auf Ihrem Server/Webhosting installiert ist und mit Ihrem interagiert Widget. Erstellen Sie also Ihr Widget PHP, um eine Anfrage an den RSS-Feed-Publishing-Webdienst Ihres Blogs zu senden. Analysieren Sie dann die von Ihrem Server zurückgegebenen Ergebnisse und zeigen Sie RSS-Feed-Elemente an.
Wenn Sie Zeit haben, um in dieses Widget zu investieren und es ernst zu nehmen, implementieren Sie besser Ihren eigenen Web-Service. Ich glaube nicht, dass es Ihnen zu schwer wird ... Spielen Sie einfach mit WP_Query und geben Sie die Ergebnisse im richtigen RSS-Feed-XML-Format zurück. Auf diese Weise können Sie Ihrem Widget-Benutzer auch die Kategorieliste im Dropdown-Menü zur Auswahl anbieten und Ihr Widget PHP so einrichten, dass RSS-Posts nur von ausgewählten Kategorien Ihres Blogs angefordert werden. Außerdem haben Sie eine bessere Kontrolle darüber, wie viele Beiträge in Ihrem RSS-Feed von Ihrem Widget angefordert werden.
Ich hoffe das hilft.
Prost,
Ruturaaj.