Проблема с пользовательской функцией при возврате в браузер

У меня есть пользовательская функция внутри functions.php чтобы показать типичные кнопки социальных сетей для каждого опубликованного сообщения (последние записи, категории и теги):

 //Social Media function showSocialButtons() { ?> <div class="social-buttons"> <div class="twitter"> <a href="https://twitter.com/share" class="twitter-share-button" data-url="<?php the_permalink() ?>" data-text="<?php the_title() ?>" data-lang="es" data-count="vertical" data-via="twitterUser"></a> </div>&nbsp; <div class="facebook"><iframe src="http://www.facebook.com/plugins/like.php?href=<?php the_permalink() ?>&amp;layout=box_count&amp;action=like&amp;share=true&amp;colorscheme=light&amp;locale=es_ES" style="height:87px; width:74px"></iframe></div> <div class="g-plusone" data-size="tall" data-href="<?php the_permalink() ?>" ></div> </div> <?php } add_action('show_social_buttons','showSocialButtons'); 

Затем в файле шаблона внутри цикла:

 <?php do_action( 'show_social_buttons' ); ?> 

Это работает правильно, но когда я возвращаюсь к списку сообщений. Например, я на главной странице со списком последних сообщений. Я нажимаю на один пост, а затем возвращаюсь на домашнюю страницу. Если я это сделаю, отображаются социальные кнопки, но не всегда в правильной должности, я имею в виду, например, на втором посту есть первые социальные кнопки и наоборот. Любая идея о том, что может быть причиной этой проблемы?

Solutions Collecting From Web of "Проблема с пользовательской функцией при возврате в браузер"

Боюсь, я не могу воспроизвести вашу проблему.

Я не уверен, почему это происходит неправильно, поскольку я не вижу цикла, который используется, но способ, которым вы, вероятно, могли бы убедиться, что он работает, – настроить вашу функцию для приема ввода $ post:

 //Social Media function showSocialButtons( $post = null ) { if( ! $post ){ global $post; } //The output } 

Вам нужно будет изменить свои функции, чтобы это отразить. Например:

 the_title(); 

станет

 echo get_the_title( $post->ID ); 

или просто

 echo $post->post_title; 

Кроме того, маловероятно, что это вызывает проблемы, но я не думаю, что вы используете крючки для действий по назначению. Действия в WP следует рассматривать аналогично событиям в javascript (но с сохраненной синхронизацией). Как вы в настоящее время используете это длинный путь к чему-то точно так же, как беспроблемный вызов функции.

В общем, действия должны быть размещены внутри функций или в важной части скрипта, чтобы к этому случаю можно было добавить несколько функций:

 function showSocialMediaButtons(){ //Some code here do_action( 'social_media_buttons_shown' ); } 

в сочетании с:

  add_action( 'social_media_buttons_shown', 'myFuncToDoAfterEveryShowingOfSocialMediaButtons' ); 

будет означать, что каждый раз

  showSocialMediaButtons(); 

называется,

  myFuncToDoAfterEveryShowingOfSocialMediaButtons(); 

будет вызываться сразу же после этого.

В любом случае, в вашей ситуации, а не в использовании

 //functions.php add_action( 'show_social_buttons', 'showSocialButtons' ); 

а также

 //template.php do_action( 'show_social_buttons' ); 

Просто используйте

 //template.php showSocialButtons(); 

или, если вы изменили функцию на использование переменной $ post в качестве аргумента, как я предложил выше:

 //template.php $q = new WP_Query( $args ); while( $q->have_posts() ): $q->next_post(); //or however you've done your loop . . . showSocialButtons( $q->post ); //or whatever is referencing the post at this time. . . . endwhile; 

Надеюсь, это поможет.