web-dev-qa-db-fra.com

Archives permaliens

Ce site m'a été très utile pour apprendre à réécrire des permaliens en utilisant add_filters pour résoudre les problèmes que nous rencontrions lorsque nous avons fusionné deux blogs en un. Mais j’ai un élément pour lequel je n’ai trouvé aucun conseil pour:

Sur les liens d’archives par date, c.-à-d. Www.domain.com/2011/12/12/

Je veux simplement les traduire sur: www.domain.com/news/2011/12/

Merci d'avance pour toute aide.

5
Scott C

La méthode la plus simple:Modifiez la structure de votre lien permanent pour inclure une partie "avant". Par exemple. /news/%postname%

La manière un peu plus compliquée et inflexible:/ WordPress conserve ses données dans une propriété de l’objet global WP_Rewrite stocké dans $wp_rewrite. Vous pouvez vous connecter à un moment précoce (autour de init) et changer cela.

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

Inflexible parce que vous avez codé en dur la base de date (news). Cela fonctionne bien, et si vous n'avez pas besoin de la flexibilité et que vous voulez une solution rapide, vous devriez le faire. Assurez-vous simplement de vider vos règles de réécriture: visitez Paramètres> Permaliens et cliquez sur Enregistrer.

La manière totalement géniale, mais un peu complexe:Ajouter un champ à la page d’options des permaliens où vous pouvez spécifier la base de date.

Une classe pour envelopper les choses dans.

<?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
    }
}

Nous devons maintenant nous connecter à admin_init et utiliser l’API des paramètres pour ajouter notre champ à la section "Facultatif". Nous devons uniquement utiliser add_settings_field car les options de permalien n'utilisent pas les paramètres de l'API.

<?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))
        );
    }
}

Nous devons également nous connecter à load-options-permalink.php pour enregistrer des éléments (en raison du manque de prise en charge des paramètres par l’API).

<?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);
        }
    }
}

Et enfin, connectez-vous à init et modifiez le permastruct de données. Nous pouvons relier certaines validations de construction que WordPress utilise en utilisant WP_Rewrite::get_date_permastruct. Ensuite, il suffit de remplacer certaines expressions rationnelles.

<?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();
        }
    }
}

Voici la troisième option encapsulée dans un plugin .

2
chrisguitarguy

on dirait que vous devez réécrire le type de message personnalisé permalink ou, dans ce cas, le permastruct.

Je n'ai pas eu le temps de tester mais avez-vous essayé avec ce plugin? http://wordpress.org/extend/plugins/custom-post-permalinks/ On dirait que vous pouvez modifier le lien permanent en ajoutant /% year% /% monthnum%/au type de message?

Vous pouvez aussi consulter le Codex ici http://codex.wordpress.org/Function_Reference/register_post_type

J'espère que ça aide.

0
Jaypee