it-swarm.com.de

Fragen Sie den benutzerdefinierten Beitragstyp nach benutzerdefiniertem Feld ab

Allgemeine Information

Ich habe das Plugin WP Types (wp-types.com) verwendet, um einen benutzerdefinierten Beitragstyp mit dem Namen " artist " zu erstellen.
In WP Types können Sie auch einen anderen Beitragstyp als übergeordneten Beitragstyp festlegen. Dies ist standardmäßig nicht möglich. Sie implementierten diese Funktion durch eine Meta-Abfrage mit dem Schlüssel:
"_ wpcf_belongs_% POSTTYPE% _id" (in meinem Fall " _ wpcf_belongs_artist_id ")
und der Wert ist die ID des übergeordneten Beitrags.

Das Problem

Wenn Sie eine Seite X als untergeordnetes Element von Seite Y festlegen, haben Sie normalerweise die folgende Permalink-Struktur:
/page-y/page-x /

Ich dachte, dieses Plugin würde dies übernehmen, aber es tut es nicht. Zum Beispiel verwende ich " painting " mit der ID 24 als übergeordnete Seite und " picasso "mit der ID 72 als untergeordneter Beitrag mit dem Beitragstyp" artist ". Also das:
/painting/picasso /
leitet mich weiter zu:
/artist/picasso /
gibt aber den richtigen Inhalt aus.

Meine Lösung nähert sich

Da die bezahlte Unterstützung mir nicht helfen konnte, muss ich es alleine versuchen. Um meine eigenen "benutzerdefinierten" Umschreiberegeln zu schreiben, muss ich zuerst die richtige Abfrage kennen. Ich habe versucht, meinen Inhalt manuell abzurufen:

index.php? _wpcf_belongs_artist_id = 24 & artist = picasso
leitet mich weiter zu:
/artist/picasso? _wpcf_belongs_artist_id = 24 & artist = picasso
mit der korrekten Ausgabe des einzelnen Künstlerposts.

Diese:
index.php? _wpcf_belongs_artist_id = 24
gibt nur meine Titelseite aus.

Die einzige mehr oder weniger funktionierende Variante ist:
/painting/picasso /? artist = picasso & _wpcf_belongs_artist_id = 24 und:
/painting/picasso /? artist = picasso
Diese leiten mich nicht zu/artist/picasso /… oder irgendwo weiter, sondern geben den korrekten einzelnen Künstlerbeitrag aus.

Hier finden Sie einige weitere Varianten und den gesamten Thread in den Support-Foren von WP Types.

Der erste Schritt wäre wahrscheinlich, den richtigen Inhalt mit einer Abfragevariable wie "parent_id" zu erhalten. Danach kann ich beginnen, mich mit den Umschreiberegeln selbst zu befassen. Möglicherweise treten Probleme auf, weil die oberste Ebene doppelt verwendet wird (% pagename% und% parent_id%). Dies wird wahrscheinlich WordPress verwirren.

UPDATE 12/17

Ich habe diesen Code ausprobiert, um alle Posts mit dem Metafeld "_wpcf_belongs_artist_id" und dem von der URL abgerufenen Meta-Wert (/? Parent_id = 24) abzurufen. Leider scheint es nicht zu funktionieren. Es stürzt die Hilfsabfragen meines Untermenüs ab und gibt nur das Ergebnis der normalen Abfrage aus.

add_filter('query_vars', 'custom_query_vars');
function custom_query_vars($vars) {
    $vars[] = 'parent_id';
    return $vars;
}

function parent_query( $query ) {
    // Exclude
    if( $query->is_admin == 1 && !$query->is_main_query() && !$query->is_archive == 1 ) {
        return;
    }
    // retrieve field name / value from URL if exist
    $custom_field = '_wpcf_belongs_artist_id';
    $custom_value = ( $_GET['parent_id'] ) ? stripslashes( $_GET['parent_id'] ) : '';
    if( $custom_field ) {
        // add meta key requirement -- we’ll return all posts with some ‘color’
        $query->set( 'meta_key', '_wpcf_belongs_artist_id' );
        if( $custom_value ) {
            // build meta value requirement -- we’ll return only blue
            $query->set( 'meta_value', $custom_value );
        }
    }
}
add_action( 'pre_get_posts', 'parent_query' );
5
luke

Du hast es ziemlich genau verstanden. Hier ist ein funktionierendes Beispiel dafür, was Sie versuchen:

class Wpse_126374 {

    public function __construct() {
        add_action( 'init', array( $this, 'rewrites' ) );
        add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
    }

    public function rewrites() {
        add_rewrite_tag( '%parent_id%', '(\d+)' );
    }

    public function pre_get_posts( $query ) {
        // Don't run this on admin pages or secondary queries
        if ( is_admin() || ! $query->is_main_query() || $query->is_archive() )
            return;

        if ( '' != ( $parent_id = get_query_var( 'parent_id' ) ) ) {
            $query->set( 'meta_key', '_wpcf_belongs_artist_id' );
            $query->set( 'meta_value', $parent_id );
        }
    }

}
$wpse_126374 = new Wpse_126374;

Dies sollte es Ihnen ermöglichen, parent_id=24 in der URL zu haben.

2
Matthew Boynes

Ich denke, das Problem ist schlecht gestellt. Was passiert, sobald Sie zwei Gemälde von Picasso hinzufügen? Sie möchten, dass sowohl/painting1/picasso als auch/painting2/picasso auf denselben "einzelnen Künstlerbeitrag" verweisen? Ich nehme an, das ist möglich, aber ich bin mir ziemlich sicher, dass es unnötig kompliziert ist (und SEO-Probleme verursachen kann).

Auf der anderen Seite finde ich es vollkommen in Ordnung, dass Picasso unter/artist/picasso angezeigt wird und dass dieser Beitrag mit allen von ihm verfassten Gemälden verknüpft ist, da Künstler und Gemälde unterschiedliche Arten von Entitäten sind.

Die Verwendung der übergeordneten Beziehung ist falsch. Ein Gemälde hat (normalerweise) nur einen Autor, aber ein Künstler kann viele Gemälde produzieren. Ein Beitrag kann jedoch nur ein Elternteil haben. Daher sollte ein Künstlerbeitrag nicht zum Kind eines seiner Gemälde gemacht werden, da sonst Probleme auftreten, sobald Sie ein weiteres Gemälde desselben Autors hinzufügen.

Stattdessen sollte der Künstler Eigentum von Gemälden sein. Sie können dies tun, indem Sie ein benutzerdefiniertes Feld für Bilder hinzufügen und möglicherweise die Pfostenbeziehungen von Types oder ein anderes Gerät verwenden, um zu erzwingen, dass sich der Wert dieses benutzerdefinierten Felds auf einen Künstlerpfostentyp bezieht.

Mit diesem Ansatz werden Ihre Probleme nicht „gelöst“, sondern verschwinden einfach.

0
adelval

Sie müssen nichts von Ihrer Funktion zurückgeben, wenn Sie pre_get_posts verwenden:

function 
if( $query->is_admin() || !$query->is_main_query() || $query->is_archive() ) {
//Do your stuff
0
Manolo