web-dev-qa-db-fra.com

Extension des attributs de shortcode

J'ai cherché beaucoup d'endroits et essayé beaucoup de manières pour cela mais sans succès.

J'ai un shortcode dans mon WP Theme comme;

[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]

(C'est le shortcode des articles récents de thème Avada). Dans le noyau, ce shortcode s'exécute

WP_Query( $args )

fonction pour obtenir des messages. Mais ce shortcode ne peut pas être utilisé avec les types de posts personnalisés car les codeurs n'ont pas mis l'attribut 'post_type' sur le shortcode $ args (ainsi, étant donné que la valeur par défaut est 'posts', le shortcode récupère uniquement les posts standard).

En conséquence, je voudrais étendre/définir une nouvelle version étendue de ce shortcode pour ajouter l'attribut 'post_type' en tant que variable (parce que j'aimerais utilisez-le pour de nombreux types de publication personnalisée). Comment puis je faire ça? Merci.

2
Alper

Sans voir votre code, il est difficile de vous donner une réponse exacte. Il existe le filtre shortcode_atts_{$shortcode} introduit dans Wordpress 3.6. Tous les attributs sont passés à travers ce filtre. Il convient de noter que le paramètre $shortcode doit être défini dans shortcode_atts . Je n'ai pas encore vu de shortcodes comportant ce paramètre.

Votre problème ici est en réalité plus important que les seuls attributs, car vous aurez besoin d'ajouter l'attribut et le paramètre post_type à vos arguments de requête. Si l'auteur n'a pas fourni de filtre personnalisé pour les arguments de la requête, vous êtes dans une impasse.

OMI, vous avez deux choix ici

  • Contactez l'auteur du thème et demandez-lui de saisir le code correspondant au shortcode lors de sa prochaine mise à jour. Je ne pense pas qu'il/elle aura un problème car cela ajoute de la valeur au shortcode

  • Créez un thème enfant et copiez le shortcode dans le thème enfant. Modifiez le code court en fonction de vos besoins et n'oubliez pas de modifier le nom de la fonction et le nom du code court en conséquence. De cette façon, vous aurez un shortcode qui correspond à vos besoins

4
Pieter Goosen

Voici juste un ajout à la réponse de @PieterGoosen.

Il existe peu de méthodes pour modifier le type de publication de WP_Query, qui se trouve dans un shortcode. Supposons que c'est [recent_posts].

Méthode A) Si le shortcode utilise le troisième paramètre de la fonction shortcode_atts() (comme indiqué par @PieterGoosen), par exemple wpse, alors:

/**
 * 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;
} );

Ici vous pouvez voir mon autre réponse sur l'utilisation de ce filtre.

Méthode B) Sinon, nous pouvons ré-enregistrer le shortcode avec un nouveau rappel.

Changez-le de old_recent_posts en 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 = '' );
}

Ici vous pouvez voir comment @toscho remplace le rappel de shortcode, dans la même question que ma réponse liée ci-dessus.

Notez que je n'ai pas testé cela, mais j'espère que vous pourrez l'adapter à vos besoins.

4
birgire