在固定链接中包含发布格式

时间:2012-10-27 作者:shea

我正在运行最新版本的WordPress,并启用了相当长的永久链接。

我正在寻找一种在帖子的永久链接中包含帖子格式类型(例如:链接、状态、引用)的方法。当帖子没有指定格式,或者使用“标准”格式时,我希望永久链接的这部分为空。

使用链接帖子格式的示例:

http://example.com/link/look-at-this-cool-site/
使用quote post格式的示例:

http://example.com/quote/example-quote-post
使用无post格式的示例:

http://example.com/just-another-post
Edit: 看见my answer 对于进度

2 个回复
最合适的回答,由SO网友:shea 整理而成

当我自己研究这个主题时,我发现了一个名为Post Format Permalink. 但是,该插件与WordPress的最新版本不兼容;它还填充了不必要的代码。

forked 插件的repository 并大大改进了代码。我现在可以使用%post_format% 在我的permalink结构中添加标签,效果很好。主要地

问题是,没有帖子格式的帖子显示为http://example.com/standard/just-another-post, 这不是期望的结果。我会继续努力,并在这里发布更新。

这是我使用的代码。也可以找到on GitHub:

<?php
/**
 * Plugin Name: Post Format Permalink
 * Plugin URI: https://wordpress.stackexchange.com/q/70627/19726
 * Description: Include the post format slug in your permalinks. Simply use the <code>%post_format%</code> tag as part of your custom permalink.
 * Version: 1.2
 * Author: shea
 * Author URI: https://wordpress.stackexchange.com/users/19726
 */

add_filter( \'post_link\', \'post_format_permalink\', 10, 2 );
add_filter( \'post_type_link\', \'post_format_permalink\', 10, 2 );

function post_format_permalink( $permalink, $post_id ) {

    // if we\'re not using the %post_format% tag in our permalinks, bail early
    if ( strpos($permalink, \'%post_format%\') === FALSE ) return $permalink;

    // get the post object
    $post = get_post( $post_id );
    if ( ! $post ) return $permalink;

    // get post format slug
    $format = get_post_format( $post->ID );

    // set the slug for standard posts
    if ( empty( $format ) )
        $format = apply_filters( \'post_format_standard_slug\', \'standard\' );

    // apply the post format slug to the permalink
    return str_replace( \'%post_format%\', $format, $permalink );
}

SO网友:bueltge

您可以通过插件向permalinks添加自定义slug,并在自定义permalinks中使用它;别忘了更新永久链接。更新规则很重要。以下源代码是一个exmaple,用于字符串的post格式%postformat%, 但不是完美的代码。最好是装在钩子上plugins_loaded 并没有创建新的类,但足以现在测试和使用它。

请检查此项,当前未测试。我写这个已经很久了。

<?php
/**
 * Plugin Name: Post Format Permalink
 * Description: Allow to use Post Format as Permalink; inlcude %postformat% in custom permalink
 */

class Fb_Add_Post_Format_Permalink {

    function __construct() {

        add_filter( \'pre_post_link\', array( $this, \'generate_permalink\' ), 10, 2 );
        add_filter( \'post_rewrite_rules\', array( $this, \'rewrite_rules\' ) );
        add_filter( \'generate_rewrite_rules\', array( $this, \'generate_rewrite_rules\' ) );
    }

    function generate_permalink( $permalink, $post ) {
        global $standard_slug;

        if ( FALSE === strpos( $permalink, \'%postformat%\' ) )
            return $permalink;

        if ( ! is_object( $post ) )
            $post = get_post( $post_id );

        $postformat = get_post_format( $post->ID );
        if ( empty( $postformat ) )
            $postformat = ! empty($standard_slug) ? $standard_slug : \'standard\';

        return str_replace( \'%postformat%\', $postformat, $permalink );
    }

    function generate_rewrite_rules( $wp_rewrite ) {
        global $clean_post_rewrites;

        $wp_rewrite->rules = $wp_rewrite->rules + $clean_post_rewrites;
    }

    function rewrite_rules( $post_rewrite ) {
        global $clean_post_rewrites, $wp_rewrite, $standard_slug;

        $wp_rewrite->use_verbose_page_rules = TRUE;

        $post_format_slugs = implode( \'|\', get_post_format_slugs() );
        if ( ! empty($standard_slug) )
            $post_format_slugs = preg_replace( \'|standard|\', $standard_slug, $post_format_slugs, 1 );

        while ( list($k, $v) = each( $post_rewrite ) ) {
            $new_k = preg_replace( \'|%postformat%|\', \'(\' . $post_format_slugs . \')\', $k, 1 );
            $clean_post_rewrites[$new_k] = $v;
        }

        return $post_rewrite;
    }

}
$post_format = new Fb_Add_Post_Format_Permalink();

结束

相关推荐

widgetlogic and permalinks

我试图使用widgetlogic在某些页面上有条件地显示菜单。每个菜单都使用如下标记is_page(array(\"Page Name\", \"Page Name 2\" ...)), 在我尝试更改permalinks之前,它一直工作得很好(因此所有菜单都会从各自的页面中消失)。我做错什么了吗?是否有解决方法?