it-swarm.com.de

Shortcode-Attribute erweitern

Ich habe viele Orte durchsucht und viele Wege ausprobiert, aber keinen Erfolg.

Ich habe einen Shortcode in meinem WP Theme wie;

[recent_posts layout="thumbnails-on-side" columns="4" number_posts="4" offset="" cat_slug="" exclude_cats="" thumbnail="yes" title="no" meta="no" excerpt="no" excerpt_length="35" strip_html="yes" animation_type="0" animation_direction="down" animation_speed="0.1" class="" id=""][/recent_posts]

(Dies ist der Kürzel für die letzten Beiträge des Avada-Themas.) Im Kern wird dieser Shortcode ausgeführt

WP_Query( $args )

funktion, um Beiträge zu erhalten. Dieser Shortcode kann jedoch nicht mit benutzerdefinierten Beitragstypen verwendet werden, da die Codierer das Attribut "post_type" nicht für den Shortcode "$ args" festgelegt haben (da der Standardwert "posts" lautet, ruft der Shortcode nur Standardbeiträge ab).

Als Ergebnis möchte ich eine neue erweiterte Version dieses Shortcodes für das Hinzufügen des Attributs 'post_type' als Variable erweitern/definieren (weil ich dies möchte) Verwenden Sie es für viele benutzerdefinierte Beitragstypen. Wie kann ich das machen? Vielen Dank.

2
Alper

Ohne Ihren Code zu sehen, ist es schwierig, Ihnen eine genaue Antwort zu geben. Es gibt den shortcode_atts_{$shortcode}-Filter, der in Wordpress 3.6 eingeführt wurde. Alle Attribute werden durch diesen Filter ausgeführt. Es ist zu beachten, dass der Parameter $shortcode in shortcode_atts gesetzt werden muss. Ich habe noch keine Shortcodes gesehen, für die dieser Parameter eingestellt ist.

Ihr Problem hier ist tatsächlich größer als nur die Attribute, da Sie das Attribut und den Parameter post_type zu Ihren Abfrageargumenten hinzufügen müssen. Wenn der Autor keinen benutzerdefinierten Filter für die Abfrageargumente angegeben hat, befinden Sie sich in einer Sackgasse.

IMO, Sie haben hier zwei Möglichkeiten

  • Wenden Sie sich an den Autor des Themas und bitten Sie ihn, bei der nächsten Aktualisierung den entsprechenden Code für den Shortcode anzugeben. Ich glaube nicht, dass er/sie ein Problem haben wird, da dies dem Shortcode einen Mehrwert verleiht

  • Erstellen Sie ein untergeordnetes Thema und kopieren Sie den Shortcode in das untergeordnete Thema. Ändern Sie den Shortcode nach Bedarf, und denken Sie daran, den Funktionsnamen und den Shortcode-Namen entsprechend zu ändern. Auf diese Weise erhalten Sie einen Shortcode, der Ihren Anforderungen entspricht

4
Pieter Goosen

Hier ist nur eine Ergänzung zur Antwort von @PieterGoosen.

Es gibt nur wenige Methoden, mit denen man den Post-Typ von WP_Query ändern kann, der sich in einem Shortcode befindet. Nehmen wir an, es ist [recent_posts].

Methode A) Verwendet der Shortcode den dritten Parameter der shortcode_atts() (wie @PieterGoosen erwähnt) zum Beispiel wpse, dann:

/**
 * Method A: Using the shortcode_atts_$shortcode filter + pre_get_posts action
 */

add_filter( 'shortcode_atts_wpse', function ( $out, $pairs, $atts )
{
    if( isset( $atts['post_type'] ) && $post_type = $atts['post_type'] )
    {
        add_action( 'pre_get_posts', function ( $q ) use ( $post_type )
        {
            static $activated = false;
            if( ! $activated )
            {
                $q->set( 'post_type', santize_key( $post_type ) );
                $activated = true;
            }
        }
    }       
    return $out;
} );

Hier können Sie meine andere Antwort zur Verwendung dieses Filters sehen.

Methode B) Anderenfalls können wir den Shortcode mit einem neuen Rückruf neu registrieren.

Ändern Sie es von old_recent_posts in new_recent_posts:

/**
 * Method B: Re-register the shortcode
 */

add_action( 'after_setup_theme', function()
{
    if( function_exists( 'old_recent_posts' ) )
    {
        remove_shortcode( 'recent_posts', 'old_recent_posts' );
        add_shortcode(    'recent_posts', 'new_recent_posts' );
    }

} );

function new_recent_posts( $atts = [], $content = '' )
{
    if( isset( $atts['post_type'] ) && $post_type = $atts['post_type'] )
    {
        add_action( 'pre_get_posts', function ( $q ) use ( $post_type )
        {
            static $activated = false;
            if( ! $activated )
            {
                $q->set( 'post_type', santize_key( $post_type ) );
                $activated = true;
            }
        }
    }       
    return old_recent_posts( $atts = [], $content = '' );
}

Hier können Sie sehen, wie @toscho den Shortcode-Rückruf ersetzt, und zwar in der Frage, die ich oben angegeben habe.

Beachten Sie, dass ich dies nicht getestet habe, aber Sie können dies hoffentlich an Ihre Bedürfnisse anpassen.

4
birgire