it-swarm.com.de

So ändern Sie Shortcode-Attribute mit Daten aus dem aktuellen Beitrag

Ich entschuldige mich im Voraus für meinen Mangel an PHP/WP-Kenntnissen und meine Bereitschaft zu erklären, wonach ich suche, aber ich versuche seit ein paar Tagen, eine Lösung zu finden, und fange gerade erst an Wickle meinen Kopf um Filter und die Schlaufe.

Folgendes möchte ich erreichen:

Ein Shortcode für ein Plugin, das ich verwende, hat ein Attribut-Tag "sched", das ich im Wesentlichen dynamisch machen möchte und das in die Kategorie slug des aktuellen (benutzerdefinierten) Posts (benutzerdefinierten) geändert wird. Hier ist ein Beispiel für einen vorhandenen Shortcode, der gut mit dem MSTW-Plugin für Zeitpläne und Anzeigetafeln zusammenarbeitet:

[mstw_schedule_table sched="v-football"]

Mein Plan war es, den Wert des Attributs "sched" auf "sport" (in allen Posts) zu setzen, als Platzhalter, der durch die benutzerdefinierte Kategorie "sport" des aktuellen Posts ersetzt wird. Ich habe alle "Sport" -Kategorie-Slugs so eingerichtet, dass sie den im Plugin verwendeten "Zeitplan" -Werten entsprechen, um sicherzustellen, dass die im aktuellen Beitrag angezeigte Zeitplantabelle korrekt ist.

Hinweis: Auf alle diese benutzerdefinierten Posts (als "Team" eingerichtet) sollte nur eine "Sport" -Kategorie angewendet werden: Ich habe "Sport" -Kategorien als Dropdown-Meta-Box in admin eingerichtet, wie z. B. this .

Hinweis: Ich möchte, dass der bearbeitbare Shortcode im Inhalt des benutzerdefinierten Beitrags verfügbar ist, damit ich andere Attribute nach Bedarf für jeden Beitrag bearbeiten kann.

Hier ist, was ich versucht habe:

Dies ist der nächste, den ich bekommen habe, aber ich weiß, dass ich den falschen Filter verwende oder die Funktion auf andere Weise zur falschen Zeit aufrufe. Beachten Sie, dass ich diesen Code in der Datei "single-team.php" ausgeführt habe, die ich für meinen benutzerdefinierten Beitragstyp vor der Schleife erstellt habe. Mir ist bewusst, dass es wahrscheinlich in functions.php oder einem separaten Plugin sein sollte (bitte geben Sie Bescheid).

Meine Inspiration:
do_shortcode_tag / get_the_terms

    add_filter( 'do_shortcode_tag', 'wpse_106269_do_shortcode_tag', 10, 4);
    function wpse_106269_do_shortcode_tag( $output, $tag, $attr, $m ) {

        if( $tag === 'mstw_schedule_table' ) {
            //* Do something useful
            if ($attr['sched'] === 'sport-slug') {
                print_r($attr);

                // Get a list of tags and extract their names
                $sport = get_the_terms( get_the_ID(), 'sport' );
                if ( ! empty( $sport ) && ! is_wp_error( $sport ) ) {
                    $sport_slug = wp_list_pluck( $sport, 'slug' );

                    $attr['sched'] = $sport_slug[0];
                }

                echo "<br>";
                print_r($attr);
            }

        }
        return $output;
    }

Diese gibt aus:

Array ( [sched] => sport-slug ) 
Array ( [sched] => v-football )

Ich weiß also, dass ich den Wert von $ attr des Shortcodes ändern kann, aber ich weiß nicht, wie ich den ursprünglichen Shortcode durch den geänderten ersetzen kann, bevor er vom Plugin analysiert wird.

Ich habe versucht, the_content zu verwenden:

// Modify Content of a Post
add_filter('the_content', 'se24265_my_function');
function se24265_my_function( $content )
{
    $write = 'hello world'; 
    $new_content = $write . $content;

        $sport = get_the_terms( get_the_ID(), 'sport' );
        if ( ! empty( $sport ) && ! is_wp_error( $sport ) ) {
            $sport_slug = wp_list_pluck( $sport, 'slug' );

            str_replace("sport-slug", $sport_slug[0], $new_content);
        }
        return $new_content; 
        // outputs hello world
        // outputs inital shortcode without modifications
}

Ich habe auch darüber nachgedacht, die Shortcode-Handler-Funktion des Plugins (wie this ) mit einem geänderten Argument auszuführen, aber ich weiß nicht, wie ich auf dieses Argument zugreifen/es ändern soll, bevor es vom Plugin interpretiert wird.

Ich habe auch this Beispiel gesehen, in dem der Shortcode in der benutzerdefinierten Beitragsvorlage generiert wird ...

// Making your custom string parses shortcode
$string = do_shortcode( $string );
// If your string has a custom filter, add its tag name in an applicable add_filter function
add_filter( 'my_string_filter_hook_tag_name', 'do_shortcode' );

... aber ich möchte die Möglichkeit behalten, den Shortcode nach Bedarf an verschiedenen Stellen in jedem benutzerdefinierten Beitrag zu bearbeiten/zu platzieren, und ich weiß immer noch nicht, welchen Filter-Hook ich verwenden soll (content_edit_pre?)

Jede Hilfe wäre dankbar. Vielen Dank.

1
Peter Arthur

Für alle, die darüber stolpern könnten, habe ich eine Lösung gefunden:

In meinem speziellen Fall verwende ich eine single- [taxonomy] .php-Vorlagendatei und konnte den Shortcode manuell über die WordPress-Funktion do_shortcode () hinzufügen, anstatt einen Shortcode innerhalb des Beitragsinhalts zu ändern.

So habe ich es geschrieben:

<?php echo do_shortcode( '[mstw_schedule_table sched="'.$sports_slug.'" ]' ); ?>

Und so konnte ich den $ sports_slug für mich arbeiten lassen. Zuvor in der Datei (außerhalb der Schleife):

// Get this post's sport taxonomy - https://wordpress.stackexchange.com/a/168862/127459
           $sports = get_the_terms($post->ID, 'sport');
           $sports_slug = '';
           if ($sports) { 

                foreach ($sports as $sport) {   
                    $sports_slug = $sport->slug;    
                }
           }

Dieser Code ist etwas weniger kompliziert als das, was ich verwendet habe (ich musste nur nicht übergeordnete Sporttaxonomien auswählen), aber diese vereinfachte Version kann jemand anderem helfen. Diese Links haben mir dabei geholfen:

Benutzerdefinierten Kategorienamen von ID abrufen (Antwort)

get_the_terms ()

1
Peter Arthur