Шорткод WordPress с резервным копированием - PullRequest
1 голос
/ 14 июля 2020

Я создаю простой плагин, который использует веб-сервис geoservices , и я пытаюсь динамически изменять содержимое на странице WordPress в зависимости от их местоположения. У меня он немного работает, но моя проблема в том, что он возвращает как текст, указывающий местоположение c, так и значение по умолчанию. Я знаю это, потому что я использую экземпляр шорткода более одного раза, но я не знаю, как изменить его, чтобы ТОЛЬКО показывать содержимое c с указанием местоположения, и если местоположение не установлено или не соответствует параметрам шорткода, тогда падение вернуться к умолчанию. Я не хочу добавлять «default» в качестве параметра шорткода, потому что он может содержать HTML или что-то еще.

Вот пример моего шорткода:

[geo city="Orlando"]<a href="#">555-123-6349</a>[/geo][geo city="Raleigh"]<a href="#">919-999-9999</a>[/geo][geo city="Default"]<a href="#">Default text here</a>[/geo]

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

Вот мой короткий код:

function geo_services( $atts , $content = null ) {

    // Attributes
    extract(shortcode_atts(array(
      'city' => '',
      'state' => '',
   ), $atts));

    require_once('geoplugin.class.php');

    $geoplugin = new geoPlugin();

    $geoplugin->locate();

    if($city === $geoplugin->city){
        return $content;
    } elseif ($state === $geoplugin->region){
        return $content;
    } elseif ($city === 'Default') {
        return $content;
    }


}
add_shortcode( 'geo', 'geo_services' );

А вот что происходит, когда я использую приведенный выше пример шорткода: введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Думаю, вы неправильно понимаете, как работают шорткоды в WP. В вашем примере вы добавили к контенту 3 шорткода. Каждый из этих шорткодов будет запущен. Ни то, ни другое. Таким образом,

[geo city="Orlando"]<a href="#">555-123-6349</a>[/geo][geo city="Raleigh"]<a href="#">919-999-9999</a>[/geo][geo city="Default"]<a href="#">Default text here</a>[/geo]

означает, что каждый из них будет вызываться и оцениваться. $geoplugin->city всегда будет возвращать город пользователя, независимо от того, какие атрибуты вы указали. И поскольку вы во всех случаях возвращаете $content, он всегда будет выплевывать контент, который вы добавили в шорткод. Вот почему вы видите все 3 ответа.

Вместо этого я бы попробовал описанный ниже подход. Если ваша цель - выдавать контент в зависимости от города пользователя, вам действительно не нужно указывать атрибут для шорткода. См. Следующий пример:

//in your post/page content, simply use the shortcode geo
[geo]

//your function should be
function geo_services( $atts , $content = null ) {

    //
    require_once('geoplugin.class.php');

    //
    $geoplugin = new geoPlugin();
    $geoplugin->locate();

    //
    switch( $geoplugin->city ) {
        case 'Orlando':
                return '<a href="#">555-123-6349</a>';
            break;
        case 'Raleigh':
                return '<a href="#">919-999-9999</a>';
            break;
        default:
                return '<a href="#">Default text here</a>';
            break;
    }

}
add_shortcode( 'geo', 'geo_services' );
0 голосов
/ 14 июля 2020

Другой ответ, основанный на комментариях OP. Если вам действительно нужно управлять контентом через WYSIWYG, вы можете предоставить контент для каждого города в качестве атрибута.

//add shortcode to post/page content
[geo orlando="555-123-6349" raleigh="919-999-9999" default="Custom default text here"]

//your function should be
function geo_services( $atts , $content = null ) {

    //don't use extract since we expect X number of atts now
    $atts = shortcode_atts(array(
        'default' => 'Default text here'
    ), $atts);

    //
    require_once('geoplugin.class.php');

    //
    $geoplugin = new geoPlugin();
    $geoplugin->locate();

    //was the city provided as an attribute?
    if( isset($atts[ strtolower($geoplugin->city) ]) ) {
        return $atts[ strtolower($geoplugin->city) ];
    }else {
        return $atts['default'];
    }

}

add_shortcode( 'geo', 'geo_services' );

Возможно, вам придется проявить творческий подход к части контента HTML, но теперь вы можете включить в шорткод X количество городов с их пользовательским содержимым. Если город не указан или не соответствует, он вернется к значению по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...