web-dev-qa-db-fra.com

Modifier la boucle pour chaque lien de partage social?

Comment modifier la boucle foreach suivante afin que chaque lien affiche letouchesde chaque requête imbriquée, et pas uniquement levalues ​​? Je crée mes propres liens de partage social, y compris en utilisant get-template-part, et je l’ai presque, je pense.

Par exemple. Twitter renvoie actuellement: https://Twitter.com/intent/tweet?TITLE&PERMALINK
Au lieu de: https://Twitter.com/intent/tweet?text=TITLE&url=PERMALINK (Remarque: text = et url =)

J'ai essayé ( $social_links as $key => $value ) et
( $social_links as $social_link && $social_link as $key => $value )

Ni de ce qui est évidemment correct.

<?php
    // Setup the links
    $social_links = array(
        'facebook'  => array(
            'title' => 'Facebook',
            'base'  => 'https://www.facebook.com/sharer/sharer.php',
            'query' => array(
                'u'     => get_permalink(),
                't'     => get_the_title(),
            ),
        ),
        'Twitter'   => array(
            'title' => 'Twitter',
            'base'  => 'https://Twitter.com/intent/Tweet',
            'query' => array(
                'text'  => get_the_title(),
                'url'   => get_permalink(),
            ),
        ),

        'pinterest' => array(
            'title' => 'Pinterest',
            'base'  => 'http://www.pinterest.com/pin/create/button/',
            'query' => array(
                'url'         => get_permalink(),
                'media'       => get_the_post_thumbnail_url(),
                'description' => get_the_title(),
            ),
        ),
        'linked-in' => array(
            'title' => 'LinkedIn',
            'base'  => 'https://www.linkedin.com/shareArticle',
            'query' => array(
                'mini'  => 'true',
                'url'   => get_permalink(),
                'title' => get_the_title(),
            ),
            // append '?refresh' to force new scrape
        ),              
    );
?>

<ul class="links-social">
<?php 
    // Loop through the links
    foreach( $social_links as $social_link ) : ?>
        <li>
            <a target="_blank" href="<?php echo $social_link['base']  . '?' . implode( '&', $social_link['query'] ); ?>">
                <?php echo $social_link['title']; ?>
            </a>
        </li>
<?php   
    endforeach;
?>
</ul>
1
the-first-man

Votre problème n'a rien à voir avec la foreach. Le problème est cette partie:

implode( '&', $social_link['query'] )

implode() relie uniquement les valeurs. Il n'y a rien dans ce code qui ajoute les clés ou un =.

Si vous souhaitez ajouter un tableau de clés/valeurs sous forme de chaîne de requête à une URL, WordPress fournit une fonction appelée add_query_arg() , qui accepte un tableau de valeurs de clé et une URL.

Dans votre cas, vous l'utiliseriez comme ceci:

<a target="_blank" href="<?php echo esc_url( add_query_arg( $social_link['query'], $social_link['base'] ) ); ?>">
    <?php echo $social_link['title']; ?>
</a>

Notez mon utilisation de esc_url. Comme la documentation déclare:

Important: The return value of add_query_arg() is not escaped by default. Output should be late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting (XSS) attacks.

Une autre chose à considérer est que les valeurs de la chaîne de requête doivent être encodées en URL. Vous pouvez le faire avec la fonction urlencode() PHP:

'title' => urlencode( get_the_title() ),

Cependant, vous devrez le faire pour chaque valeur si vous le faites comme ça. Une façon de procéder avec moins de code consisterait à utiliser array_map() à appliquer urlencode() à chaque valeur juste avant de mettre dans add_query_arg():

foreach( $social_links as $social_link ) :
    $query_args = array_map( 'urlencode', $social_link['query'] );
    ?>

    <li>
        <a target="_blank" href="<?php echo esc_url( add_query_arg( $query_args, $social_link['base'] ) ); ?>">
            <?php echo $social_link['title']; ?>
        </a>
    </li>

    <?php
endforeach;
1
Jacob Peattie