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