it-swarm.com.de

Festlegen der Eltern-Kind-Beziehung zwischen verschiedenen benutzerdefinierten Beitragstypen

Ich habe gerade eine Beziehung zwischen einem Beitragstyp "Folgen" und einem Beitragstyp "Zeichentrickserie" eingerichtet.

Ich habe dieses Code-Bit verwendet, um es in das Meta-Feld einzufügen und das übergeordnete Element eines anderen Beitragstyps zuzuweisen:

add_action('admin_menu', function() {
    remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
    } // end hierarchical check.
}

Das hat auf dem Admin-Bildschirm funktioniert, als ich die Serie als übergeordnetes Element für die Episode festlegen konnte. Wenn ich jedoch versuche, den Beitrag anzuzeigen, erhalte ich den Wert 404. Die URL-Struktur lautet:

domain/episodes/series-name/episode-name

Die URL für die Serie lautet:

domain/cartoon-series/series-name

Ich möchte, dass die URL für die Folge lautet:

domain/cartoon-series/series-name/episode-name

Was vermisse ich? Ist es möglich, einen ganzen Beitragstyp zum Kind eines anderen Beitragstyps zu machen? Dann könnte ich sogar die URL für die Episodenliste erhalten:

domain/cartoon-series/series-name/episodes

Vielen Dank! Matt


Wie gewünscht, ist hier der Code für die beiden fraglichen benutzerdefinierten Beitragstypen:

$labels = array(
    "name" => "Cartoon Series",
    "singular_name" => "Cartoon Series",
    "menu_name" => "Cartoon Series",
    "all_items" => "All Cartoon Series",
    "add_new" => "Add New",
    "add_new_item" => "Add New Cartoon Series",
    "edit" => "Edit",
    "edit_item" => "Edit Cartoon Series",
    "new_item" => "New Cartoon Series",
    "view" => "View",
    "view_item" => "View Cartoon Series",
    "search_items" => "Search Cartoon Series",
    "not_found" => "No Cartoon Series Found",
    "not_found_in_trash" => "No Cartoon Series Found in Trash",
    "parent" => "Parent Cartoon Series",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "cartoon-series", $args );

$labels = array(
    "name" => "Episodes",
    "singular_name" => "Episode",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "episodes", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "episodes", $args );

Ich verwende das CPT-UI-Plugin, daher kann ich diesen Code nicht direkt bearbeiten. Dies ist nur der Exportcode, den die CPT-Benutzeroberfläche bereitstellt.

Ich habe keinen anderen Code, der die beiden CPTs verbindet. Vielleicht fehlt mir das ja. Ich habe gerade den Code online gefunden, der die Metabox auf der Seite platziert, um die Verknüpfung herzustellen. Reicht es nicht aus, die Arbeit zu erledigen? Sieht so aus, als würde post_parent gesetzt.

Vielen Dank! Matt

12
Mattaton

Endlich habe ich eine funktionierende Lösung gefunden. Die Zeichentrickserie kann wie bisher registriert werden, aber die benutzerdefinierten Beitragstypen der Episoden können nicht hirarchisch sein (ich denke, WordPress erwartet, dass übergeordneter Inhalt dem untergeordneten Inhalt entspricht, wenn die Beziehung mit post_parent in der Datenbanktabelle wp_posts festgelegt wird).

Bei der Registrierung von Episoden muss die Umschreiberegel auf den gewünschten Slug gesetzt werden, d. H. cartoon-series/%series_name%. Dann können wir den Episoden-Link filtern, um %series_name% durch den tatsächlichen Namen des übergeordneten cartoon-series-Post-Typs zu ersetzen, und eine Umschreiberegel festlegen, die WordPress mitteilt, wann ein Post-Typ für eine Zeichentrickserie angefordert wird und wann es sich um eine Episode handelt.

add_action('init', function(){
    $labels = array(
        "name" => "Cartoon Series",
        "singular_name" => "Cartoon Series",
        "menu_name" => "Cartoon Series",
        "all_items" => "All Cartoon Series",
        "add_new" => "Add New",
        "add_new_item" => "Add New Cartoon Series",
        "edit" => "Edit",
        "edit_item" => "Edit Cartoon Series",
        "new_item" => "New Cartoon Series",
        "view" => "View",
        "view_item" => "View Cartoon Series",
        "search_items" => "Search Cartoon Series",
        "not_found" => "No Cartoon Series Found",
        "not_found_in_trash" => "No Cartoon Series Found in Trash",
        "parent" => "Parent Cartoon Series",
    );

    $args = array(
        "labels" => $labels,
         "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => true,
        "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "cartoon-series", $args );

    $labels = array(
        "name" => "Episodes",
        "singular_name" => "Episode",
    );

    $args = array(
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "cartoon-series/%series_name%", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "episodes", $args );

});

add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
}

add_action( 'init', function() {

    add_rewrite_rule( '^cartoon-series/(.*)/([^/]+)/?$','index.php?episodes=$matches[2]','top' );

});

add_filter( 'post_type_link', function( $link, $post ) {
    if ( 'episodes' == get_post_type( $post ) ) {
        //Lets go to get the parent cartoon-series name
        if( $post->post_parent ) {
            $parent = get_post( $post->post_parent );
            if( !empty($parent->post_name) ) {
                return str_replace( '%series_name%', $parent->post_name, $link );
            }
        } else {
            //This seems to not work. It is intented to build pretty permalinks
            //when episodes has not parent, but it seems that it would need
            //additional rewrite rules
            //return str_replace( '/%series_name%', '', $link );
        }

    }
    return $link;
}, 10, 2 );

NOTE: Denken Sie daran, die Umschreiberegeln nach dem Speichern des obigen Codes zu leeren, bevor Sie ihn ausprobieren. Gehen Sie zu wp-admin/options-permalink.php und klicken Sie auf "Speichern", um die Umschreiberegeln zu wiederholen.

ANMERKUNG 2 : Möglicherweise müssen mehr Umschreiberegeln hinzugefügt werden, um beispielsweise für paginierte Posts zu arbeiten. Außerdem muss möglicherweise noch etwas gearbeitet werden, um eine vollständige Lösung zu erhalten. Zum Beispiel, wenn Sie einen cartoon-series löschen, werden auch alle untergeordneten Folgen gelöscht. Einen Filter im Admin-Bearbeitungsbildschirm hinzufügen, um Episoden nach übergeordneten Elementen zu filtern? Ändern Sie den Episodentitel im Admin-Bearbeitungsbildschirm, um den Namen der übergeordneten Serie anzuzeigen.

9
cybmeta

In diesem Fall ist HARD-CODING nicht erforderlich. Sie können einfach dieses Plugin verwenden:

https://wordpress.org/plugins/add-hierarchy-parent-to-post/

Sie können sogar Code daraus holen. Möglicherweise handelt es sich jedoch nicht um eine vollständige Lösung.

1
T.Todua