Вопрос или проблема
Я пытаюсь добавить шорткод addtoany на свою пользовательскую страницу цикла, но ссылка для обмена всегда остается одинаковой для всех постов в цикле.
<?php
global $post;
echo do_shortcode('[addtoany url="' . the_permalink() . '" title="' . the_title() . '"]')
?>
Я также пробовал с get_permalink()
, get_permalink($post->ID)
, get_the_permalink()
… но ничего не работает. Это должно работать так, согласно официальной документации.
Я не понимаю почему :/
ИЗМЕНЕНИЕ
Вот полная функция:
<?php
add_filter( 'generate_do_template_part', function( $do ) {
if ( is_archive() || is_search() ) {
return false;
}
return $do;
});
add_action( 'generate_before_do_template_part', function() {
global $post;
if ( is_archive() || is_search() ) : ?>
<article <?php post_class(); ?>>
<div class="inside-article sf-result">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="sfr-inner">
<div><?php if ( has_post_thumbnail() ) { ?><div class="sfr-thumb"><a href="<?php the_permalink() ?>"><?php the_post_thumbnail("medium") ?></a></div><?php } ?></div>
<div><p><?php the_excerpt(); ?></p></div>
<div class="sfr-inner-bottom">
<span class="mdi mdi-share"></span><!-- иконка обмена -->
<div class="sfr-share-box"><?php echo do_shortcode('[addtoany url="' . get_the_permalink() . '" title="' . get_the_title() . '"]') ?></div><!-- открывается при клике с помощью функции jQuery -->
</div>
</div>
</div>
</article>
<?php endif;
}); ?>
С этой функцией я переопределяю цикл на страницах архива и поиска, созданных темой GeneratePress (и плагином searchanfilter). Я получаю правильную постоянную ссылку для заголовка, миниатюры и эксцерпа без проблем, но не внутри этого шорткода.
Ладно, я понял. И теперь это кажется мне таким очевидным, что я немного стыжусь (наверное, я устал). Я потратил 2 дня на эту проблему, прежде чем осознать, что сделал большую ошибку.
Я использовал этот jQuery для открытия модального окна ‘.sfr-share-box’, содержащего иконки обмена (с наложением на всю ширину):
$('.sfr-share').on('click', function() {
$('.sfr-share-box').fadeIn();
});
И так, как вы, вероятно, уже догадались, ВСЕ модальные окна открывались одновременно, одно над другим. И только последнее появлялось, и поэтому у меня всегда была одна и та же ссылка для обмена.
Я изменил функцию, и теперь все работает хорошо.
$('.sfr-share').on('click', function() {
$(this).closest('.sf-result').children('.sfr-share-box').fadeIn();
});
Я, вероятно, заслуживаю отрицательный голос, потому что это так глупо, но я рад, что наконец нашел это ^^ В любом случае, спасибо, ребята, за ваши советы (мы всегда учимся на своих ошибках, верно?).
Ответ или решение
Вопрос, который вы подняли, касается использования шорткода AddToAny в пользовательском цикле WordPress. Исходя из вашей эпопеи, связаной с проблемой одинаковой ссылки на общий ресурс для всех постов в цикле, давайте подробно разберём вашу реализацию и то, как решить возникшую проблему.
Проблема
Вы добавили шорткод AddToAny в пользовательский цикле на странице архива или поиска, но столкнулись с тем, что ссылка для обмена остаётся неизменной для всех постов. Вы использовали метод do_shortcode
с the_permalink()
и различными вариантами, но результаты не соответствовали вашим ожиданиям.
Анализ
Ваша первоначальная реализация, использующая do_shortcode
со следующими параметрами:
echo do_shortcode('[addtoany url="' . the_permalink() . '" title="' . the_title() . '"]');
вызвана именно тем, что вы вывели ссылку на текущий пост через the_permalink()
, однако этот метод не возвращает значение, так как он выводит его непосредственно, что может привести к проблемам в контексте использования шорткодов.
Решение
Вместо использования the_permalink()
, лучше использовать get_the_permalink()
, который возвращает permalink в строковом виде. Таким образом структура кода должна выглядеть так:
echo do_shortcode('[addtoany url="' . get_the_permalink() . '" title="' . get_the_title() . '"]');
Причина изначальной проблемы
Как вы правильно заметили, основная проблема заключалась не в коде, а в функциональности jQuery, использованного для открытия модальных окон. Когда вы используете селектор $('.sfr-share')
, все ваши элементы с классом sfr-share
реагируют на одно и то же событие. В результате, при клике на любой элемент, все окна начинают открываться одновременно, и таким образом, только одно (последнее) из них остаётся видимым.
Исправление jQuery
Ваше исправление, как:
$('.sfr-share').on('click', function() {
$(this).closest('.sf-result').children('.sfr-share-box').fadeIn();
});
является правильным решением проблемы. Теперь при клике на кнопку "Поделиться" открывается только то окно, которое соответствует конкретному посту, обеспечивая корректную визуализацию и функциональность.
Заключение
Ошибки — это важная часть процесса обучения, и ваша настойчивость в их поиске и исправлении достойна похвалы. Важно помнить, что очень часто решение проблемы может быть не в самом коде, а в его взаимодействии с другими частями системы. При поиске решений старайтесь учитывать все возможные аспекты, чтобы добиться наилучшего результата.
Если у вас появятся дополнительные вопросы или появятся новые задачи, не стесняйтесь обращаться за помощью. Всегда рад помочь!