如何以编程方式更改Wordpress的默认帖子永久链接?

时间:2018-09-20 14:51:02

标签: php wordpress wordpress-theming permalinks custom-wordpress-pages

在Wordpress的后端中,我使用默认的http://localhost/sitename/example-post/值来创建永久链接。

对于自定义帖子类型,我以此方式定义了一个自定义子词,例如services

register_post_type( 'service',
    array(
        'labels'      => array(
            'name'          => __( 'Services' ),
            'singular_name' => __( 'Service' )
        ),
        'public'      => true,
        'has_archive' => true,
        'rewrite'     => array(
            'slug'       => 'services',
            'with_front' => true
        ),
        'supports'    => array(
            'title',
            'editor',
            'excerpt',
            'thumbnail'
        ),
        'taxonomies'  => array( 'category' ),
    )
);

它将创建服务/职位名称

我还使用此钩子来创建自定义页面,以创建自定义页面永久链接:

function custom_base_rules() {
    global $wp_rewrite;

    $wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/';
}

add_action( 'init', 'custom_base_rules' );

它将创建页面/职位名称

现在,我唯一需要做的就是为普通的Wordpress 帖子创建另一个自定义的永久链接路径。

因此,结果世界应该是post的帖子类型:

帖子/帖子名称

我不能为此使用支持,因为我已经定义了处理永久链接的默认方式。我已经设法重写了自定义帖子类型和页面的路径...

如何在Wordpress中以编程方式重写普通的post帖子类型的永久链接路径?

3 个答案:

答案 0 :(得分:1)

帖子必须使用默认的永久链接结构,与页面或自定义帖子类型不同,它们在重写对象中没有特殊条目。如果要以编程方式更改默认结构,则可以在挂钩中添加类似的内容。

$wp_rewrite->permalink_structure = '/post/%postname%';

我不太清楚你说的意思

  

我不能为此使用支持,因为我已经定义了处理永久链接的默认方式。我已经设法重写了自定义帖子类型和页面的路径...

听起来好像您在覆盖除帖子以外的所有永久链接的默认行为,因此,如果更改默认设置,则无论如何都可能只会影响帖子。

答案 1 :(得分:0)

GentlemanMax建议的function custom_permalinks() { global $wp_rewrite; $wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/'; // custom page permalinks $wp_rewrite->set_permalink_structure( $wp_rewrite->root . '/post/%postname%/' ); // custom post permalinks } add_action( 'init', 'custom_permalinks' ); 属性对我不起作用。但是我发现了一个有效的方法set_permalink_structure()。请参见下面的代码示例。

}

答案 2 :(得分:0)

您需要分两个步骤进行操作。

首先使用'with_front' => true启用内置帖子注册功能

add_filter(
    'register_post_type_args',
    function ($args, $post_type) {
        if ($post_type !== 'post') {
            return $args;
        }

        $args['rewrite'] = [
            'slug' => 'posts',
            'with_front' => true,
        ];

        return $args;
    },
    10,
    2
);

通过这种方式,像http://foo.example/posts/a-title这样的url可以工作,但是生成的链接现在是错误的。

可以通过对内置帖子强制使用自定义的永久链接结构来固定链接

add_filter(
    'pre_post_link',
    function ($permalink, $post) {
        if ($post->post_type !== 'post') {
            return $permalink;
        }

        return '/posts/%postname%/';
    },
    10,
    2
);

请参见https://github.com/WordPress/WordPress/blob/d46f9b4fb8fdf64e02a4a995c0c2ce9f014b9cb7/wp-includes/link-template.php#L166