使用ACF值更改固定链接

时间:2018-02-13 作者:Beee

我正在运行一个网站,允许用户创建一个配置文件,这是一种自定义的帖子类型,通过ACF前端表单提交/编辑。除了用户都使用相同的“标题”(经过消毒并用作永久链接)外,所有操作都按预期进行。

我希望永久链接具有以下“结构”:“post type/city/{post title}-{post id}。我的想法是添加一个帖子id,这样每个链接都是唯一的,但我现在发现情况并非如此。

如果我有两个配置文件:www.domain。com/profile/city/i-am-cool-123www。领域com/profile/city/i-am-cool-456

然后是www.domain。com/profile/city/i-am-cool-456重定向到www.domain。com/profile/city/i-am-cool-123。

我知道你不能有2个相同的永久链接,但我可能误解了永久链接是如何“注册”的。

下面是我的代码。

首先,我为新的变量添加了必要的查询变量,并添加了自定义重写标记。

function sd_custom_rewrite_tag() {
    add_rewrite_tag( \'%city%\', \'([^&]+)\', \'city=\' );
    add_rewrite_tag( \'%postname%\', \'([^&]+)\', \'name=\' );
}
add_action( \'init\', \'sd_custom_rewrite_tag\', 10, 0 );

function sd_add_query_vars( $vars ) {
    $vars[] = "city";
    $vars[] = "postname";

    return $vars;
}
add_filter( \'query_vars\', \'sd_add_query_vars\' );
为了获得我想要的永久链接,我有以下代码。

function sd_new_profile_permalink( $permalink, $post, $leavename = false ) {

    if ( strpos( $permalink, \'%city%\' ) === FALSE ) {
        return $permalink;
    }

    // Get post
    if ( ! $post ) {
        return $permalink;
    }

    // Get custom info
    $city_info  = get_field( \'sd_city_selector\', $post->ID );
    $post_slug  = $post->post_name;
    if ( ! is_wp_error( $city_info ) && ! empty( $city_info ) ) {
        $city_replace  = str_replace( \'\\\'\', \'\', $city_info[ \'cityName\' ] );
        $city_replace  = str_replace( \' \', \'-\', $city_replace );
        $city_slug     = strtolower( $city_replace );
        $new_permalink = str_replace( array( \'%city%\', \'%postname%\', \'%post_id%\' ), array( $city_slug, $post_slug, $post->ID ), $permalink );

        return $new_permalink;
    }
    return $permalink;
}
add_filter( \'post_link\', \'sd_new_profile_permalink\', 10, 3 );
add_filter( \'post_type_link\', \'sd_new_profile_permalink\', 10, 3 );
到目前为止,没有什么奇怪的事情发生,这一切都在做它应该做的事情,但现在我们开始着手解决这个问题(我想)。

提交帖子后,我通过WPDB操作更新slug,如下所示。

function set_profile_title_from_headline( $post_id ) {

    if ( empty( $_POST[ \'acf\' ] ) ) {
        return;
    }

    if ( ! empty( $_POST[ \'acf\' ][ \'field_57e3ed6c92ea0\' ] ) ) {
        $entered_title = $_POST[ \'acf\' ][ \'field_57e3ed6c92ea0\' ];
        $cleaned_title = preg_replace( \'/[^A-Za-z0-9\\-\\s]/\', \'\', $entered_title ); 
        $post_name     = sanitize_title( $cleaned_title );
        update_field( \'sd_ad_title\', $cleaned_title, $post_id ); 

        global $wpdb;
        $wpdb->update(
            $wpdb->posts,
            array(
                \'post_title\'  => $cleaned_title,
                \'post_name\'   => $post_name
            ),
            array(
                \'ID\' => $post_id
            )
        );

        clean_post_cache( $post_id );

    }

}
add_action( \'acf/save_post\', \'set_profile_title_from_headline\', 20 );
最后我重写了url。

function sd_single_profile_rewrite() {
    global $wp_rewrite;
    $wp_rewrite->add_permastruct( \'profile\', \'profile/%city%/%postname%-%post_id%/\', false );
    add_rewrite_rule( \'profile\\/([a-z-]+)\\/(.+)-[0-9]+\\/?$\', \'index.php?post_type=profile&p=$matches[2]&city=$matches[1]&name=$matches[2]\', \'top\' );
}
add_action( \'init\', \'sd_single_profile_rewrite\' );
基本上,我的问题是:有没有办法“做”我想做的事?如果是,如何:)

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

我觉得太“难”了。与其重建新的permalink结构,我可以轻松地按照我想要的方式更新新的permalink。

因此,我删除了整个重写部分,并将acf/save\\U post中的查询更改为以下内容:

if ( ! empty( $_POST[ \'acf\' ][ $ad_title ] ) ) {

    $entered_title = $_POST[ \'acf\' ][ $ad_title ];
    $cleaned_title = preg_replace( \'/[^A-Za-z0-9\\-\\s]/\', \'\', 
    $entered_title ); // Removes special chars.
    $post_name     = sanitize_title( $cleaned_title );
    $city_name     = get_field( \'sd_city_search_value\', $post_id );
    $new_slug      = strtolower( $city_name ) . \'-\' . $post_name . \'-\' . $post_id;

    // update acf field
    update_field( \'sd_ad_title\', $cleaned_title, $post_id );

    // update post status + post title (if needed)
    global $wpdb;
    $wpdb->update(
        $wpdb->posts,
        array(
            \'post_title\'  => $cleaned_title,
            \'post_name\'   => strtolower( get_field( \'sd_city_search_value\', $post_id ) ) . \'-\' . $post_name . \'-\' . $post_id
        ),
        array(
            \'ID\' => $post_id
        )
    );

    clean_post_cache( $post_id );

}

SO网友:Slam

/i-am-cool-123i-am-cool-456 实际上是两个不同的帖子?

如果是这样,那么请确保您需要两个不同的永久链接。

但您的用例听起来像是您有一篇帖子,并且您希望跟踪来自站点上不同页面的访问。在这种情况下,你可能想add UTM codes to the ends of you URLs 跟踪他们。

编辑:我想你的意思是你会有两个个人资料。。。但在不同的城市?这个i-am-cool-123 part是帖子名称,它们必须是唯一的。创建一个i-am-cool-234 并将其重定向到i-am-cool-123 因为没有人能够访问i-am-cool-234 —单击该链接将带您访问i-am-cool-123.

post\\u名称之前的部分,URL的其余部分。。。没关系。red/applesyellow/apples 两人通常都会去一个名为apples. 路径由Wordpress生成,多个路径可以指向同一篇文章(这就是为什么为了SEO目的,最好定义一个规范的URL)。

您可以创建一个自定义的永久链接来解析路径。大概yellow/apples 重定向到yellow/apples-yellowred/apples 重定向到red/apples-red, 但是你的重写需要从路径中提取一些内容,并放在帖子名称的末尾。听起来像皮塔。

但没有什么能阻止你拥有相同的帖子标题。/i-am-cool-123i-am-cool-456 都会出现在URL中,但两个页面的标题仍然是“我很酷”。

结束

相关推荐

How to replace permalinks

我已将wordpress项目导出并导入live server。现在的问题是,我将permalink结构作为“localhost”格式。当我单击网站中的任何链接时,它会将我重定向到localhost。我怎样才能改变这一点?我的htaccess文件如下所示<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /myproject/ RewriteRule ^index\\.php$ - [L] RewriteCo

使用ACF值更改固定链接 - 小码农CODE - 行之有效找到问题解决它

使用ACF值更改固定链接

时间:2018-02-13 作者:Beee

我正在运行一个网站,允许用户创建一个配置文件,这是一种自定义的帖子类型,通过ACF前端表单提交/编辑。除了用户都使用相同的“标题”(经过消毒并用作永久链接)外,所有操作都按预期进行。

我希望永久链接具有以下“结构”:“post type/city/{post title}-{post id}。我的想法是添加一个帖子id,这样每个链接都是唯一的,但我现在发现情况并非如此。

如果我有两个配置文件:www.domain。com/profile/city/i-am-cool-123www。领域com/profile/city/i-am-cool-456

然后是www.domain。com/profile/city/i-am-cool-456重定向到www.domain。com/profile/city/i-am-cool-123。

我知道你不能有2个相同的永久链接,但我可能误解了永久链接是如何“注册”的。

下面是我的代码。

首先,我为新的变量添加了必要的查询变量,并添加了自定义重写标记。

function sd_custom_rewrite_tag() {
    add_rewrite_tag( \'%city%\', \'([^&]+)\', \'city=\' );
    add_rewrite_tag( \'%postname%\', \'([^&]+)\', \'name=\' );
}
add_action( \'init\', \'sd_custom_rewrite_tag\', 10, 0 );

function sd_add_query_vars( $vars ) {
    $vars[] = "city";
    $vars[] = "postname";

    return $vars;
}
add_filter( \'query_vars\', \'sd_add_query_vars\' );
为了获得我想要的永久链接,我有以下代码。

function sd_new_profile_permalink( $permalink, $post, $leavename = false ) {

    if ( strpos( $permalink, \'%city%\' ) === FALSE ) {
        return $permalink;
    }

    // Get post
    if ( ! $post ) {
        return $permalink;
    }

    // Get custom info
    $city_info  = get_field( \'sd_city_selector\', $post->ID );
    $post_slug  = $post->post_name;
    if ( ! is_wp_error( $city_info ) && ! empty( $city_info ) ) {
        $city_replace  = str_replace( \'\\\'\', \'\', $city_info[ \'cityName\' ] );
        $city_replace  = str_replace( \' \', \'-\', $city_replace );
        $city_slug     = strtolower( $city_replace );
        $new_permalink = str_replace( array( \'%city%\', \'%postname%\', \'%post_id%\' ), array( $city_slug, $post_slug, $post->ID ), $permalink );

        return $new_permalink;
    }
    return $permalink;
}
add_filter( \'post_link\', \'sd_new_profile_permalink\', 10, 3 );
add_filter( \'post_type_link\', \'sd_new_profile_permalink\', 10, 3 );
到目前为止,没有什么奇怪的事情发生,这一切都在做它应该做的事情,但现在我们开始着手解决这个问题(我想)。

提交帖子后,我通过WPDB操作更新slug,如下所示。

function set_profile_title_from_headline( $post_id ) {

    if ( empty( $_POST[ \'acf\' ] ) ) {
        return;
    }

    if ( ! empty( $_POST[ \'acf\' ][ \'field_57e3ed6c92ea0\' ] ) ) {
        $entered_title = $_POST[ \'acf\' ][ \'field_57e3ed6c92ea0\' ];
        $cleaned_title = preg_replace( \'/[^A-Za-z0-9\\-\\s]/\', \'\', $entered_title ); 
        $post_name     = sanitize_title( $cleaned_title );
        update_field( \'sd_ad_title\', $cleaned_title, $post_id ); 

        global $wpdb;
        $wpdb->update(
            $wpdb->posts,
            array(
                \'post_title\'  => $cleaned_title,
                \'post_name\'   => $post_name
            ),
            array(
                \'ID\' => $post_id
            )
        );

        clean_post_cache( $post_id );

    }

}
add_action( \'acf/save_post\', \'set_profile_title_from_headline\', 20 );
最后我重写了url。

function sd_single_profile_rewrite() {
    global $wp_rewrite;
    $wp_rewrite->add_permastruct( \'profile\', \'profile/%city%/%postname%-%post_id%/\', false );
    add_rewrite_rule( \'profile\\/([a-z-]+)\\/(.+)-[0-9]+\\/?$\', \'index.php?post_type=profile&p=$matches[2]&city=$matches[1]&name=$matches[2]\', \'top\' );
}
add_action( \'init\', \'sd_single_profile_rewrite\' );
基本上,我的问题是:有没有办法“做”我想做的事?如果是,如何:)

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

我觉得太“难”了。与其重建新的permalink结构,我可以轻松地按照我想要的方式更新新的permalink。

因此,我删除了整个重写部分,并将acf/save\\U post中的查询更改为以下内容:

if ( ! empty( $_POST[ \'acf\' ][ $ad_title ] ) ) {

    $entered_title = $_POST[ \'acf\' ][ $ad_title ];
    $cleaned_title = preg_replace( \'/[^A-Za-z0-9\\-\\s]/\', \'\', 
    $entered_title ); // Removes special chars.
    $post_name     = sanitize_title( $cleaned_title );
    $city_name     = get_field( \'sd_city_search_value\', $post_id );
    $new_slug      = strtolower( $city_name ) . \'-\' . $post_name . \'-\' . $post_id;

    // update acf field
    update_field( \'sd_ad_title\', $cleaned_title, $post_id );

    // update post status + post title (if needed)
    global $wpdb;
    $wpdb->update(
        $wpdb->posts,
        array(
            \'post_title\'  => $cleaned_title,
            \'post_name\'   => strtolower( get_field( \'sd_city_search_value\', $post_id ) ) . \'-\' . $post_name . \'-\' . $post_id
        ),
        array(
            \'ID\' => $post_id
        )
    );

    clean_post_cache( $post_id );

}

SO网友:Slam

/i-am-cool-123i-am-cool-456 实际上是两个不同的帖子?

如果是这样,那么请确保您需要两个不同的永久链接。

但您的用例听起来像是您有一篇帖子,并且您希望跟踪来自站点上不同页面的访问。在这种情况下,你可能想add UTM codes to the ends of you URLs 跟踪他们。

编辑:我想你的意思是你会有两个个人资料。。。但在不同的城市?这个i-am-cool-123 part是帖子名称,它们必须是唯一的。创建一个i-am-cool-234 并将其重定向到i-am-cool-123 因为没有人能够访问i-am-cool-234 —单击该链接将带您访问i-am-cool-123.

post\\u名称之前的部分,URL的其余部分。。。没关系。red/applesyellow/apples 两人通常都会去一个名为apples. 路径由Wordpress生成,多个路径可以指向同一篇文章(这就是为什么为了SEO目的,最好定义一个规范的URL)。

您可以创建一个自定义的永久链接来解析路径。大概yellow/apples 重定向到yellow/apples-yellowred/apples 重定向到red/apples-red, 但是你的重写需要从路径中提取一些内容,并放在帖子名称的末尾。听起来像皮塔。

但没有什么能阻止你拥有相同的帖子标题。/i-am-cool-123i-am-cool-456 都会出现在URL中,但两个页面的标题仍然是“我很酷”。

相关推荐

Permalinks - Archives

WordPress文档说:WordPress offers you the ability to create a custom URL structure for your permalinks and archives. https://codex.wordpress.org/Settings_Permalinks_Screen 我看到此屏幕将如何为特定帖子/页面创建永久链接,但我没有看到此设置屏幕上关于如何为存档帖子/页面创建链接的任何其他详细信息。有人能澄清一下吗?