Короткий код AddToAny в цикле

Вопрос или проблема

Я пытаюсь добавить шорткод 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();
});

является правильным решением проблемы. Теперь при клике на кнопку "Поделиться" открывается только то окно, которое соответствует конкретному посту, обеспечивая корректную визуализацию и функциональность.

Заключение

Ошибки — это важная часть процесса обучения, и ваша настойчивость в их поиске и исправлении достойна похвалы. Важно помнить, что очень часто решение проблемы может быть не в самом коде, а в его взаимодействии с другими частями системы. При поиске решений старайтесь учитывать все возможные аспекты, чтобы добиться наилучшего результата.

Если у вас появятся дополнительные вопросы или появятся новые задачи, не стесняйтесь обращаться за помощью. Всегда рад помочь!

Оцените материал
Добавить комментарий

Капча загружается...