webentwicklung-frage-antwort-db.com.de

Widget mit zufälligen Beiträgen aus einem Blog für externe Seiten

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?

3
forallatlantis

So erstellen Sie eine spezielle Ausgabe von zufälligen Beiträgen:

  1. Registrieren Sie einen Endpunkt im Stammverzeichnis Ihres Blogs. Weitere Informationen finden Sie in A (Mostly) Complete Guide to the WordPress Rewrite API .
  2. Aktualisieren Sie die Permalink-Einstellungen. Ich würde dies nur bei (De-) Aktivierung tun.
  3. Hängen Sie sich in '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 :

enter image description here

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.

6
fuxia

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.

0
Ruturaj