web-dev-qa-db-fra.com

Comment modifier les attributs de shortcode avec les données de la publication actuelle

Je m'excuse par avance de mon manque de connaissances en PHP/WP et de mon explication explicite de ce que je recherche, mais j'essaie de trouver une solution depuis quelques jours maintenant, et je commence tout juste à enrouler ma tête autour des filtres et de la boucle.

Voici ce que j'aimerais accomplir:

Un shortcode pour un plugin que j'utilise a une balise d'attribut "sched" que je voudrais rendre essentiellement dynamique, modifiée pour la catégorie slug de la publication (personnalisée) en cours (personnalisée). Voici un exemple de shortcode existant qui fonctionne bien avec le plugin MSTW Schedules and Scoreboards:

[mstw_schedule_table sched="v-football"]

Mon plan était de définir la valeur de l'attribut "sched" sur "sport" (sur toutes les publications) en tant qu'espace réservé qui serait remplacé par le slug de catégorie personnalisée "sport" de la publication actuelle. J'ai configuré tous les slugs de la catégorie "sport" pour qu'ils correspondent aux valeurs "sched" utilisées dans le plugin, afin de garantir l'exactitude du tableau de planification affiché sur le message en cours.

Remarque: Toutes ces publications personnalisées (configurées en tant qu '"équipe") ne doivent avoir qu'une seule catégorie "sport": j'ai créé les catégories "sport" en tant que méta-boîte déroulante dans admin, comme this .

Remarque: j'aimerais également que le code court éditable soit disponible dans le contenu de la publication personnalisée afin de pouvoir modifier les autres attributs nécessaires à chaque publication.

Voici ce que j'ai essayé:

C'est ce que j'ai de plus proche, mais je sais que j'utilise le mauvais filtre ou que j'appelle la fonction au mauvais moment. Notez que j'ai exécuté ce code dans le fichier "single-team.php" que j'ai créé pour mon type d'article personnalisé, avant la boucle. Je suis conscient que cela devrait probablement être dans functions.php ou dans un plugin séparé (s'il vous plaît aviser).

Mon 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;
    }

Cela génère:

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

Donc, je sais que je peux changer la valeur du $ attr du shortcode, mais je ne sais pas comment remplacer le shortcode original par le modifié, avant qu'il ne soit analysé par le plugin.

J'ai essayé d'utiliser the_content :

// 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
}

J'ai aussi pensé à exécuter la fonction de gestionnaire de shortcode du plugin (comme this ) avec un argument modifié, mais je ne sais pas comment accéder à/modifier cet argument avant qu'il ne soit interprété par le plugin.

J'ai aussi vu this exemple où le shortcode est généré dans le modèle de publication personnalisé ...

// 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' );

... mais j'aimerais conserver la possibilité d'éditer/placer le shortcode à différents endroits dans chaque publication personnalisée selon les besoins, et je ne sais toujours pas quel raccord de filtre utiliser (content_edit_pre?)

Toute aide serait appréciée. Merci.

1
Peter Arthur

Pour ceux qui pourraient tomber sur cela, j'ai trouvé une solution:

Dans mon cas particulier, j'utilise un fichier de modèle [taxonomie] .php unique et j'ai pu ajouter le shortcode manuellement via la fonction WordPress do_shortcode () au lieu de modifier un shortcode dans le contenu de l'article.

Voici comment je l'ai écrit:

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

Et voici comment j'ai obtenu le $ sports_slug pour moi. Précédemment dans le fichier (en dehors de la boucle):

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

Ce code est légèrement moins compliqué que ce que j’avais utilisé (je n’avais besoin que de sélectionner des taxonomies sportives non parentales), mais cette version simplifiée peut aider quelqu'un d’autre. Ces liens m'ont aidé tout au long du chemin:

Obtenir un nom de catégorie personnalisé à partir de l'ID (réponse)

get_the_terms ()

1
Peter Arthur