URL重写将作者添加为基础

时间:2018-06-05 作者:Augus

我正试图为我的设计师网站找一位作家。下面我将举一个我想做的例子:

我有一个名为“designer a”的设计师,名字很好,叫做“designer-a”。我有一个名为“Awesome art”的艺术对象(自定义贴子类型),名字是nicename“Awesome art”。

我想实现艺术品的URL为“http://domain.com/designer-a/awesome-art/“”

为了实现这一点,我在自定义帖子类型中添加了重写,如下所示:

    \'rewrite\' => array(
        \'slug\' => \'/%author%/\',
    ),
并添加了如下过滤器:

add_filter( \'post_type_link\', \'art_post_type_link\', 10, 4 );
function art_post_type_link( $post_link, $post, $leavename, $sample )
{
    if ( \'art\' == $post->post_type ) {
        $authordata = get_userdata( $post->post_author );
        $author = $authordata->user_nicename;
        $post_link = str_replace( \'%author%\', $author, $post_link );
    }

    return $post_link;
}
这确实有效,但现在我无法访问我的正常页面,我得到了404。所以这不是我想要的解决方案。所以我的问题是,我想要的东西可能吗?如果可能的话,我做错了什么?

会喜欢一些输入!

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

好吧,经过一些更深入的研究和许多错误,我得到了一个似乎合法的修复。

首先,我在自定义帖子类型中保留了重写规则,但确实更改了名称:

\'rewrite\' => array(
    \'slug\' => \'/%designer%/\',
),
然后,我需要将%designer%指向正确的字段(在我的示例中,这是由ACF创建的自定义字段。我的操作如下:

add_filter( \'post_type_link\', \'art_post_type_link\', 10, 4 );

function art_post_type_link( $post_link, $post, $leavename, $sample )
{
    if ( \'art\' == $post->post_type ) {
        $designer = get_field( \'designer\', $post->ID );
        $post_link = str_replace( \'%designer%\', $designer[\'user_nicename\'], $post_link );
    }

    return $post_link;
}
然后我需要确保设计者/作者有自己的URL,没有/作者/基础。还有/%作者%/%艺术名称%作品。我用下面的作者重写了这篇文章。

add_filter( \'author_rewrite_rules\', \'no_author_base_rewrite_rules\' );

function no_author_base_rewrite_rules( $author_rewrite ) {
    global $wpdb;
    $author_rewrite = array();
    $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");

    foreach($authors as $author) {
        $author_rewrite["({$author->nicename})/?$"] = \'index.php?author_name=$matches[1]\';
        $author_rewrite["({$author->nicename})/([^/]+)/?$"] = \'index.php?post_type=art&name=$matches[2]\';
    }

    return $author_rewrite;
}
然后,如果不是在admin中,我需要在全局$wp\\u rewrite中禁用author\\u base:

if( !is_admin() ) {
    add_action(\'init\', \'author_rewrite_base_null\');
}

function author_rewrite_base_null() {
    global $wp_rewrite;
    if( \'author\' == $wp_rewrite->author_base ) $wp_rewrite->author_base = null;
}
这对我起到了作用,希望对其他人有所帮助。

结束

相关推荐

If post author role is X

简化我当前显示特色帖子的方式,当一篇帖子由正式成员提交时,会向帖子添加一个post\\u meta值,然后以不同的样式显示。但是我想根据帖子作者,用户角色来做这件事。因此,如果提交帖子的用户是“full\\u成员”,那么他们的帖子将自动显示,而无需查询post\\u meta。我在归档模板循环中尝试过类似的方法,只是在包装div中添加了一个“featured listing”类,但我认为我没有正确地看待它。 <?php $user = wp_get_current_user(); if (