it-swarm.com.de

Ändern Sie Permalinks mit ACF-Werten

Ich führe eine Website aus, auf der Benutzer ein Profil erstellen können. Hierbei handelt es sich um einen benutzerdefinierten Beitragstyp, der über ein ACF-Front-End-Formular übermittelt/bearbeitet wird. Alles funktioniert wie erwartet, außer wenn beide Benutzer dieselbe Überschrift verwenden (die bereinigt und als Permalink verwendet wird).

Ich möchte, dass der Permalink die folgende 'Struktur' hat:/post-type/city/{post-title} - {post-id}. Mein Gedanke war, eine Beitrags-ID hinzuzufügen, damit jeder Link einzigartig ist, aber ich habe jetzt herausgefunden, dass dies nicht der Fall ist.

Wenn ich 2 Profile hätte: www.domain.com/profile/city/i-am-cool-123 www.domain.com/profile/city/i-am-cool-456

Dann leitet www.domain.com/profile/city/i-am-cool-456 zu www.domain.com/profile/city/i-am-cool-123 weiter.

Ich wusste, dass Sie nicht zwei gleiche Permalinks haben können, aber ich habe möglicherweise falsch verstanden, wie Permalinks "registriert" sind.

Unten ist mein Code.

Zuerst habe ich die erforderlichen Abfragevariablen für die neuen Variablen hinzugefügt und benutzerdefinierte Umschreibetags hinzugefügt.

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' );

Um den von mir gewünschten Permalink zu erhalten, muss der folgende Code vorhanden sein.

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

Bisher passiert nichts Seltsames, das alles tut, was es tun soll, aber jetzt kommen wir zum Thema (glaube ich).

Ich aktualisiere den Slug durch eine WPDB-Aktion, nachdem der Beitrag gesendet wurde (siehe unten).

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

Und dann schreibe ich endlich die URL um.

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' );

Grundsätzlich lautet meine Frage: Gibt es eine Möglichkeit, das zu tun, was ich tun möchte? Und wenn ja, wie :)

2
Beee

Ich dachte zu 'schwierig'. Anstatt eine neue Permalink-Struktur neu zu erstellen, hätte ich den neuen Permalink problemlos so aktualisieren können, wie ich ihn haben möchte.

Also habe ich den gesamten Teil zum Umschreiben gelöscht und die Abfrage in acf/save_post wie folgt geändert:

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

}
2
Beee