it-swarm.com.de

Permalinks archivieren

Diese Seite war für mich sehr hilfreich, um zu lernen, wie man Permalinks mit add_filters umschreibt, um Probleme zu lösen, die wir hatten, als wir zwei Blogs zu einem zusammengeführt haben. Ich habe jedoch einen Artikel, für den ich keine Tipps finden konnte:

Auf dem Datum basierende Archivlinks, d. H. Www.domain.com/2011/12/

Ich möchte sie einfach übersetzen zu: www.domain.com/news/2011/12/

Vielen Dank im Voraus für jede Hilfe.

5
Scott C

Der wirklich einfache Weg:Ändere deine Permalink-Struktur, um einen "Front" -Teil einzuschließen. Z.B. /news/%postname%

Der etwas kompliziertere und unflexibelere Weg:WordPress speichert seine Datenpermastruktur in einer Eigenschaft des globalen WP_Rewrite-Objekts, das in $wp_rewrite gespeichert ist. Sie können irgendwann früh einbinden (um init) und dies ändern.

<?php
add_action('init', 'wpse39274_change_date');
function wpse39274_change_date()
{
    global $wp_rewrite;
    $wp_rewrite->date_structure = '/news/%year%/%monthnum%/%day%';
}

Unflexibel, weil Sie die Datumsbasis fest codiert haben (news). Dies funktioniert einwandfrei. Wenn Sie die Flexibilität nicht benötigen und eine schnelle Lösung wünschen, sollten Sie dies tun. Stellen Sie einfach sicher, dass Sie Ihre Umschreiberegeln leeren: Gehen Sie zu Einstellungen> Permalinks und klicken Sie auf Speichern.

Die großartige, aber etwas komplizierte Art:Füge der Seite mit den Permalinks-Optionen ein Feld hinzu, in dem du die Datumsbasis festlegen kannst.

Eine Klasse zum Einpacken.

<?php
class Custom_Date_Base
{
    const SETTING = 'custom_date_base';

    private static $ins = null;

    public static function init()
    {
        add_action('plugins_loaded', array(self::instance(), '_setup'));
    }

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    public function _setup()
    {
        // we'll hook stuff in here later
    }
}

Jetzt müssen wir uns in admin_init einbinden und die Einstellungs-API verwenden, um unser Feld dem Abschnitt "Optional" hinzuzufügen. Wir müssen nur add_settings_field verwenden, da die Permalink-Optionen die Einstellungs-API nicht verwenden.

<?php
class Custom_Date_Base
{
    const SETTING = 'custom_date_base';

    private static $ins = null;

    public static function init()
    {
        add_action('plugins_loaded', array(self::instance(), '_setup'));
    }

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    public function _setup()
    {
        add_action('admin_init', array($this, 'settings'));
    }

    public function settings()
    {
        add_settings_field(
            'custom-date-base',
            __('Date Base', 'custom-date-base'),
            array($this, 'field_cb'),
            'permalink',
            'optional',
            array('label_for' => self::SETTING)
        );
    }

    public function field_cb()
    {
        printf(
            '<input type="text" class="regular-text" id="%1$s" name="%1$s" value="%2$s" />',
            esc_attr(self::SETTING),
            esc_attr(get_option(self::SETTING))
        );
    }
}

Wir müssen uns auch in load-options-permalink.php einbinden, um Dinge zu speichern (aufgrund der fehlenden API-Unterstützung für Einstellungen).

<?php
class Custom_Date_Base
{
    // snip snip

    public function _setup()
    {
        add_action('admin_init', array($this, 'settings'));
        add_action('load-options-permalink.php', array($this, 'save'));
        add_action('init', array($this, 'set_date_base'));
    }

    // snip snip

    // apparently options-permalink only halfways uses the settings api?
    public function save()
    {
        // make sure it's actually an update request.
        if('POST' != $_SERVER['REQUEST_METHOD'])
            return;

        // since this fires before the actual update stuff,
        // validate the permalink nonce.
        check_admin_referer('update-permalink');

        if(!empty($_POST[self::SETTING]))
        {
            update_option(
                self::SETTING,
                sanitize_title_with_dashes($_POST[self::SETTING])
            );
        }
        else
        {
            // remove it.
            delete_option(self::SETTING);
        }
    }
}

Und schließlich in init einbinden und die Datenpermastruktur ändern. Wir können auf einige eingebaute Validierungen zurückgreifen, die WordPress mithilfe von WP_Rewrite::get_date_permastruct durchführt. Dann ist es nur eine Frage des Regex-Austauschs.

<?php
class Custom_Date_Base
{
    // snip snip

    public function _setup()
    {
        add_action('admin_init', array($this, 'settings'));
        add_action('load-options-permalink.php', array($this, 'save'));
        add_action('init', array($this, 'set_date_base'));
    }

    // snip snip

    public function set_date_base()
    {
        if($db = get_option(self::SETTING))
        {
            global $wp_rewrite;

            // current date permastruct
            $date_s = $wp_rewrite->get_date_permastruct();

            // get the "front" -- stuff before rewrite tags in post links
            $front = isset($wp_rewrite->front) ? $wp_rewrite->front : '/';

            // build some regex. We need to account for the global rewrite 
            // "front" as well as a possible "/date" that WP appends for
            // %post_id% permalink structure where the numbers of a Post ID
            // might conflict with with year/month/day numbers.
            $regex = '#^' . preg_quote($front, '#') . '(/date)?#ui';

            $wp_rewrite->date_structure = preg_replace($regex, "/{$db}/", $date_s);

            // apprently we need to make sure this happens?
            flush_rewrite_rules();
        }
    }
}

Hier ist die dritte Option, die in ein Plugin eingebunden ist.

2
chrisguitarguy

klingt so, als müssten Sie den benutzerdefinierten Post-Typ-Permalink oder in diesem Fall die Permastruktur neu schreiben.

Ich hatte keine Zeit zum Testen, aber hast du es mit diesem Plugin versucht? http://wordpress.org/extend/plugins/custom-post-permalinks/ Sieht aus, als könnten Sie den Permalink bearbeiten, indem Sie dem Beitragstyp /% year% /% monthnum%/hinzufügen?

Sie können sich auch den Codex hier ansehen http://codex.wordpress.org/Function_Reference/register_post_type

Ich hoffe, es hilft.

0
Jaypee