toscho.design

WordPress: Eine Seite in eine andere einbetten

Da die Frage gerade auf WordPress Stack Exchange gestellt wurde, habe ich ein kleines Plugin aktualisiert, mit dem man den Inhalt einer Seite beliebigen Typs in eine andere einbetten kann.

Das Plugin verwendet die Shortcode-API. Man muß im Editor also eingeben:

[embed_post id=1 title="hello" type="post"]

Im Normalfall ist die Post-ID die beste Wahl, wenn man sie kennt. Die beiden anderen Parameter werden dann ignoriert, weil die ID eindeutig ist. Ansonsten kann man auch den Titel verwenden und ihn um den Posttypen ergänzen, um die Treffgenauigkeit zu verbessern.

Ich rate strengstens davon ab, Beiträge gegenseitig einzubetten. In beiden werden nämlich Shortcodes aufgelöst, und dann holt man sich eben die Geister ins Haus, die zwischen zwei gegenüberstehenden Spiegeln wohnen …

GitHub: https://gist.github.com/3380118

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Embed Post Shortcode
 * Description: Embed any page, post or custom post type with shortcode: <code>[embed_post id=1 title="hello" type="post"]</code>.
 * Plugin URI:  http://toscho.de/?p=2056
 * Version:     2012.08.17
 * Author:      Thomas Scholz
 * Author URI:  http://toscho.de
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 *
 * T5 Embed Page Shortcode, Copyright (C) 2012 Thomas Scholz
 */

add_shortcode( 'embed_post', 't5_embed_post' );

/**
 * Get a post per shortcode.
 *
 * @param  array $atts There are three possible attributes:
 *         id: A post ID. Wins always, works always.
 *         title: A page title. Show the latest if there is more than one post
 *              with the same title.
 *         type: A post type. Only to be used in combination with one of the
 *              first two attributes. Might help to find the best match.
 *              Defaults to 'page'.
 * @return string|void
 */
function t5_embed_post( $atts )
{
    $defaults = array (
        'id'    => FALSE,
        'title' => FALSE,
        'type'  => 'page'
    );
    extract( shortcode_atts( $defaults, $atts ) );

    // Not enough input data.
    if ( ! $id and ! $title )
    {
        return;
    }

    $post = FALSE;

    if ( $id )
    {
        $post = get_post( $id );
    }
    elseif ( $title )
    {
        $post = get_page_by_title( $title, OBJECT, $type );
    }

    if ( $post )
    {
        return apply_filters( 'the_content', $post->post_content );
    }
}

Ein Kommentar

  1. David am 17.08.2012 · 20:08

    Ich rate strengstens davon ab, Beiträge gegenseitig einzubetten. In beiden werden nämlich Shortcodes aufgelöst, und dann holt man sich eben die Geister ins Haus, die zwischen zwei gegenüberstehenden Spiegeln wohnen …

    Schön formuliert. ☺