• Здравствуйте. Помогите решить вот такую задачу.
    В конце материала нужно добавлять ссылку на первоисточник следующим образом:
    <a href="http://pervoistochik.com/bla-bla-bla.html">Источник</a>

    Но что бы каждый раз не писать Источник и вставлять гиперссылку, хочу реализовать это через custom fields.

    Добавил customfield avtor в которое вставляю ссылку.
    В конце статьи (в single.php) поставил <?php echo (get_post_meta($post->ID, 'avtor', true)); ?>

    В таком виде после статьи отображается то, что вводишь в кастом филд. Отображается как текст.

    Теперь попробовал превратить это в ссылку таким образом :
    <a href="<?php echo (get_post_meta($post->ID, 'avtor', true)); ?>">Источник</a>

    Получилось, что после материала появилась надпись Источник, но ведет она на ссылку, которая склеивается с двух урлов: url страницы на которой опубликована статья и url который введен в кастом филд.

    Напр:moysite.com/moiastatia/chujoisite.com/originalnaiastatia/

    Также если не добавлен кастом филд, то в конце статьи выводиться надпись Источник, которая ведет на эту же страницу moysite.com/moiastatia/

    Как реализовать задуманную штуку правильно?

    Спасибо

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Привет,
    вот как можно сделать ссылку кликабельной:

    1) нужно добавить условие: если данные в поле существуют — выводить ссылку, если нет — ничего не выводить:

    2) обязательно используйте функцию esc_attr_e() вместо echo внутри атрибутов!. Ну это так, на будущее — здесь не понадобится.

    3) добавьте дополнительные хелперы для превращения url в ссылки:

    // используется в ooh_my_make_clickable и делает http строку ссылкой
    function ooh_my_make_url_clickable($matches) {
        $url = $matches[2];
        $url = esc_url($url);
        if (empty($url))
    		return $matches[0];
        return $matches[1] . "<a target=\"_blank\" href=\"$url\" rel=\"nofollow\">$url</a>";
    }
    
    // Ищет любой http адрес и автоматически превращает в ссылку
    function ooh_my_make_clickable($ret) {
        $ret = ' ' . $ret;
        $ret = preg_replace_callback('#(?<=[\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#$%&~/=?@\[\](+-]|[.,;:](?![\s<]|(\))?([\s]|$))|(?(1)\)(?![\s<.,;:]|$)|\)))+)#is', 'ooh_my_make_url_clickable', $ret);
        $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
        $ret = trim($ret);
        return $ret;
    }

    Поместите эти хелперы в файл functions.php вашей активной темы и используйте везде, где пожелаете

    4) Ваш код должен выглядеть примерно так:

    <?php if( get_post_meta( $post->ID, 'avtor', true ) ) echo 'Источник: ' . stripslashes( ooh_my_make_clickable( get_post_meta( $post->ID, 'avtor', true ) ) ) ); ?>

    Попробуйте это и дайте знать, если что-то не работает.

    Здравствуйте.

    Попробовал. Если без http… то не определяет текст ка ссылку.

    Получилось вот так:

    Источник: https://www.google.com.ua/

    а я хочу сделать вот так:

    Источник

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    moysite.com/moiastatia/chujoisite.com/originalnaiastatia/

    Такая ссылка получится, если перед chujoisite.com не указать http://. Сделайте, чтобы протокол перед выводом добавлялся автоматически, если в произвольном поле он не указан.

    2) обязательно используйте функцию esc_attr_e() вместо echo внутри атрибутов!

    Замечание в целом верное, но esc_attr_e() предназначена только для строк, подлежащих переводу. Для обычных атрибутов нужно использовать esc_attr(), а для ссылок — esc_url():
    http://codex.wordpress.org/Function_Reference/esc_attr
    http://codex.wordpress.org/Function_Reference/esc_url

    3) добавьте дополнительные хелперы для превращения url в ссылки

    В WordPress есть штатная функция make_clickable():
    http://codex.wordpress.org/Function_Reference/make_clickable

    Сергей, спасибо, по поводу «указывать http://&#187; — помогло.
    Осталась проблемка: если avtor не указано, то автоматом подставляется адрес страницы на которой находимся.

    Не критично, но хотелось бы убрать в таких случаях «Источник».

    Я в программировании 0, поэтому вывел это так: if(get_post_meta( $post->ID, 'avtor', true)) echo

    Получился полный код: <?php if(get_post_meta( $post->ID, 'avtor', true)) echo <a href="<?php echo (get_post_meta($post->ID, 'avtor', true)); ?>">Источник</a> ?>

    Но он не работает ))) Выдает ошибку. Лишний знак <

    Вот.

    Сергей, спасибо большое за комментарии, буду работать с документацией.

    @vabzz простите, что желание помочь превратилось в медвежью услугу для вас. Позвольте реабелитироваться перед вами:

    <?php
    if( get_post_meta( $post->ID, 'avtor', true) )
    	echo '<a href="' . esc_url( get_post_meta( $post->ID, 'avtor', true) ) . '">Источник</a>';
    ?>

    @dikiy_forester — работает!!! Огромное спасибо!!

    …жаль плюсануть негде

    Не за что по факту 😀 Спасибо Сергею!

    Удачи с вашим проектом!

    [SOLVED]

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Тема «Ссылка на источник через custom field» закрыта для новых ответов.