Benutzerdefinierte Permalink-Struktur für mehrere benutzerdefinierte post_type-URLs mit add_permastruct, die den Fehler / 404 für reguläre Beiträge zurückgibt

Lesezeit: 5 Minuten

Benutzeravatar von theKing
der König

In meinem WP v6.1 habe ich zwei benutzerdefinierte Porttypen: company, product und benutzerdefinierte Taxonomie country.

Gewünschte URL-Struktur ist %country%/%company_postname% und %country%/%product_postname% bzw. unten ist der Code für $wp_rewrite:

add_action('init', 'custom_init');

function custom_init() {

global $wp_rewrite;
$company_url="/%country%/%company_postname%";
$product_url="/%country%/%product_postname%";

$wp_rewrite->add_permastruct('company', $company_url, false);
$wp_rewrite->add_permastruct('product', $product_url, false);

$wp_rewrite->add_rewrite_tag("%company_postname%", '([^/]+)', "company=");
$wp_rewrite->add_rewrite_tag("%product_postname%", '([^/]+)', "product=");
}

Mit obigem Code und einem anderen post_type_link Filterfunktion kann ich meine benutzerdefinierten URLs generieren. Das Problem ist jedoch regelmäßig post und page Beiträge werden nicht zurückgegeben gefunden error_404.

Normale Post-/Seiten-Standard-URL-Struktur: www.example.com/%postname%

Habe versucht add_permastruct für Beiträge & Seiten, aber das hat nicht funktioniert. Wie zeige ich Seiten und Posts an, während ich die benutzerdefinierten URLs für meine benutzerdefinierten Posts habe?

Aktualisierung 1
Benutzerdefinierte Posts und Taxonomien wurden per Code erstellt.

Beispiel von company Code

function company_post_type() {

    $labels = array(
        'name' => _x('Company', 'Post Type General Name', 'text'),
    );
    $args = array(
        'labels' => $labels,
        'supports' => array('title', 'editor', 'custom-fields'),
        'taxonomies' => array('country'),
        'query_var' => true,
        'rewrite' => false
    );
    register_post_type('company', $args);
}

add_action('init', 'company_post_type', 0);

Aktualisierung 2

Und mein post_type_link Funktion ist:

function post_type_link_function($url, $post) {

    // only if post is published
    if ('' != $url && !in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {

        // get country terms
        $terms = wp_get_object_terms($post->ID, 'country');

        // country
        if (strpos($url, '%country%') !== FALSE) {
            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
                $country = urlencode($terms[0]->slug);
                $url = str_replace('%country%', $country, $url);
            }
        }

        // post names
        $postnames = array('%company_postname%', '%product_postname%', '%postname%');
        foreach ($postnames as $postname) {
            $postname = $post->post_name;
            $url = str_replace($postnames, $postname, $url);
        }

        return $url;
    }

    return $url;
}

Aktualisierung 3

Wenn Permalinks auf Plain eingestellt sind www.example.com/?p=123alle Posts, Seiten und benutzerdefinierten Posts werden gut geladen.

Aktualisierung 4

Ich habe beobachtet, dass Beiträge und Seiten auch nicht verwendet werden single.php oder page.php Vorlage. Es nutzt index.php. Wobei ich diesen Seiten oder Beiträgen keine Vorlagen beigefügt habe.

Update 5 – behoben

Es lag an der 'rewrite' => array('slug' => "https://stackoverflow.com/", 'with_front' => FALSE) in dem country benutzerdefinierte Taxonomie. Ohne das rewrite Jetzt sind die Seiten und Beiträge in Ordnung.

  • Wie hast du einen benutzerdefinierten Beitrag erstellt?[company, product] (über Plugin oder eigenen Code) ?

    – json

    10. Dezember 2022 um 7:17 Uhr


  • Durch eigenen Code siehe bitte meine aktualisierte Frage.

    – der König

    10. Dezember 2022 um 14:52 Uhr

  • Und was ist Ihre “andere post_type_link-Filterfunktion”?

    – Alexis Vandepitte

    11. Dezember 2022 um 13:23 Uhr

  • post_type_link Funktionsupdate in der Frage.

    – der König

    13. Dezember 2022 um 13:02 Uhr

Benutzeravatar von Moishy
Moisch

Du kannst den … benutzen post_type_link Haken.

Fügen Sie Ihren benutzerdefinierten Beitragstyp und Ihre Taxonomie mit Ihrer benutzerdefinierten Umschreibung hinzu:

function company_post_type() {
    
    $labels = array(
        'name' => _x('Company', 'Post Type General Name', 'text'),
    );
    
    $args = array(
        'labels' => $labels,
        'show_ui' => true,
        'public' => true,
        'publicly_queryable' => true,
        'supports' => array('title', 'editor', 'custom-fields'),
        'taxonomies' => array('country'),
        'query_var' => true,
        'rewrite' => array( 'slug' => '%country%', 'with_front' => false ),
    );
    
    register_post_type('company', $args);
    
    
    $tax_args = array(
        'hierarchical'      => true,
        'public'            => true,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'show_in_rest'      => true,
    );

    register_taxonomy( 'country', 'company', $tax_args );

}
    
add_action('init', 'company_post_type', 0);

Dann führen wir über den Hook eine Ersetzung auf dem Permalink aus:

function replace_post_link( $post_link, $id = 0 ){
    $post = get_post($id);
    $post_type = get_post_type( $id );
    if ( is_object( $post ) && $post_type == 'company'){
        
        $cat="country";
        
        $terms = wp_get_object_terms( $post->ID, $cat );
        if( $terms && !is_wp_error($terms) ){
            return str_replace( '%country%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'replace_post_link', 1, 3 );

AKTUALISIEREN:

Es scheint eine Eigenart mit WordPress zu geben, wenn Sie diese Syntax für Ihre Umschreibung verwenden, sodass Sie dem Begriff eine Front voranstellen müssen.

'rewrite' => array( 'slug' => 'country/%country%', 'with_front' => false )

und im Ersetzungslink:

return str_replace( 'country/%country%', $terms[0]->slug , $post_link );

Dann lautet Ihre URL:

country/%country%/%company_postname%

Stellen Sie sicher, dass Sie Ihre Rewrite-Regeln leeren, wenn Sie fertig sind, indem Sie zu: Einstellungen > Permalinks gehen und auf „Änderungen speichern“ klicken.

  • Meine benutzerdefinierten Beitragstyp-URLs sind in Ordnung. Ich habe Probleme mit der Standardeinstellung post wollte nur den URL-Aufbau so haben www.example.com/%postname% während die oben genannten benutzerdefinierten URL-Strukturen für benutzerdefinierte Beiträge verwendet werden.

    – der König

    13. Dezember 2022 um 12:58 Uhr

  • Scheint eine seltsame Macke von WordPress zu sein. Sie müssen dem Begriff eine Front hinzufügen. Ich werde meine Antwort aktualisieren

    – Moisch

    13. Dezember 2022 um 16:34 Uhr

  • Mit oder ohne 'with_front' => false, meine benutzerdefinierten Beitrags-URLs funktionieren einwandfrei. Das einzige Problem ist die Standardeinstellung post Beiträge, die 404 / Seite nicht gefunden zurückgibt.

    – der König

    14. Dezember 2022 um 23:15 Uhr

  • Richtig. Lesen Sie meine aktualisierte Antwort. Es ist eine Eigenart in WordPress. Die einzige Möglichkeit, dies zu umgehen, besteht darin, der URL des benutzerdefinierten Beitragstyps eine Front hinzuzufügen, und die Beiträge funktionieren einwandfrei

    – Moisch

    14. Dezember 2022 um 23:32 Uhr

  • Das macht meine benutzerdefinierten Post-URLs country/%country%/%company_postname% Anstatt von /%country%/%company_postname%mit oder ohne with_front. Und die Beiträge sind immer noch 404.

    – der König

    15. Dezember 2022 um 0:02 Uhr

1438160cookie-checkBenutzerdefinierte Permalink-Struktur für mehrere benutzerdefinierte post_type-URLs mit add_permastruct, die den Fehler / 404 für reguläre Beiträge zurückgibt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy