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.
}
Auf dem Administratorbildschirm konnte ich die Serie als übergeordnetes Element für die Episode festlegen. 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
quelle
parent_id
Query Var und benötigt keinen weiteren Code, um die Beziehung festzulegen. Das Problem ist, dass die generierte URL von WordPress nicht erkannt wird. Ich habe versucht, eine Umschreiberegel zu finden , die funktioniert, aber ich hatte keinen Erfolg. Ich suche jetzt nach einer Lösung.pre_get_posts
die Abfrage ohne Erfolg zu ändern. Es handelt sich um etwas Komplizierteres, das ich nicht verstehen konnte. Als ob eine Katze Eltern eines Hundes wäre. Ich empfehle, nur einen hierarchischen Beitragstyp zu verwenden oder die Beziehung mithilfe von Metafeldern festzulegen .Antworten:
Endlich habe ich eine funktionierende Lösung gefunden. Die Zeichentrickserie kann wie Sie 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
post_parent
in derwp_posts
Datenbanktabelle festgelegt wird).Bei der Registrierung von Episoden muss die Umschreiberegel auf den gewünschten Slug eingestellt werden
cartoon-series/%series_name%
. Dann können wir den Episoden-Link filtern, um ihn%series_name%
durch den tatsächlichen Namen des übergeordnetencartoon-series
Post-Typs zu ersetzen, und eine Umschreiberegel festlegen, die WordPress mitteilt, wann ein Post-Typ für eine Zeichentrickserie angefordert wird und wann eine Episode ist.HINWEIS : Denken Sie daran, die Umschreiberegeln nach dem Speichern des obigen Codes und vor dem Testen zu löschen. Gehen Sie zu
wp-admin/options-permalink.php
und klicken Sie auf Speichern, um die Umschreiberegeln neu zu erstellen.HINWEIS 2 : Möglicherweise müssen mehr Umschreiberegeln hinzugefügt werden, um beispielsweise für paginierte Posts zu funktionieren. Auch kann es etwas mehr Arbeit erfordern, um eine vollständige Lösung zu haben, zum Beispiel beim Löschen eines
cartoon-series
Löschvorgangs auch alle Kinderepisoden? 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.quelle
domain/episodes/series-name/episode-name
wie zuvor, bekam ichdomain/episodes/series-name/series-name/episode-name
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.
quelle
Sie müssen dafür Ihren eigenen URL-Parsing-Code schreiben, da WordPress den Typ des Posts kennen muss, den es basierend auf der URL-Struktur aus der Datenbank abzurufen versucht, und Ihre URL-Struktur keinen Hinweis darauf gibt.
Dies ist nicht sehr einfach mit der API für das Umschreiben von Regeln von WordPress zu tun, aber es gibt nichts, was Sie daran hindert, den Umschreibemechanismus zu umgehen und die URLs selbst zu analysieren. So etwas wie 1. WordPress ReWite-Regeln ausführen. Wenn ein Inhalt gefunden wurde, zeigen Sie ihn an und beenden Sie 2. Rufen Sie den ersten Teil der URL ab, und überprüfen Sie, ob ein Beitrag vorhanden ist, der dem erwarteten Beitragstyp entspricht im richtigen Typ. 4. Wenn alles passt, wird der zuletzt gefundene Beitrag angezeigt, andernfalls wird eine 404-Seite angezeigt
quelle