Меню Breadcrumb дублирует ссылку при разборе строки запроса - PullRequest
0 голосов
/ 17 октября 2019

Я создал хлебное меню, которое получает URL страницы, explodes текст после каждой косой черты (после домена) и выводит его на печать.

Это работает нормально, если строка запроса не добавленаоднако к URL-адресу после добавления запроса дублируется ссылка:

Рабочий пример:

<?php
    $url = "/parent/child";
    // 1. Get URL
    $crumbs = explode("/", trim($url, '/'));
    // 2. Strip extras
    $build = '';
    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= '/'.$crumb;
        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = "child";  

        echo $key < $lastKey
            ? "$crumb /" : $pagename;
    }
?>

Приведенные выше выходные данные: Parent /child

Что нормально.

Однако, теперь второй тест со строкой запроса (обратите внимание на $url):

<?php
    $url = "/parent/child/?=query-string";
    // 1. Get URL
    $crumbs = explode("/", trim($url, '/'));
    // 2. Strip extras
    $build = '';
    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= '/'.$crumb;
        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = "parent";  

        echo $key < $lastKey
            ? "$crumb   /" : $pagename;
    }
?>

Это выводит: Parent / Child / parent Ожидаемый результат: ** Parent / Child **

Я понимаю, что установил $pagename = "parent", но хочу, чтобы он игнорировал строки запроса.

Я пробовал следующее:

$crumbs = explode("/", trim($_SERVER["REQUEST_URI"], '/'));
$crumbs = preg_replace('/\?.*/', '', $crumbs);

Все те же результаты.

Последний код:

<?php

    // 1. Get current URL
    $crumbs = trim($_SERVER["REQUEST_URI"]);
    $crumbs = preg_replace('/\?.*/', '', $crumbs);
    $crumbs = explode("/", $crumbs);
    array_filter($crumbs);


    $count = count($crumbs);
    $build = '';

    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;

    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= $crumb;

        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = get_query_var('pagename');  
        $pagename = the_title('', '', false); // print page name as is in WP
        $pagename = preg_replace('/-/', ' ', $pagename); // remove dashes
        $pagename = trim($pagename);

        echo $key < $lastKey
            ? "<a class='crumbLink' href=".$build.">".$crumb."</a>
               <span class='slash'>/</span>"
            : $pagename;

    }


?>

Ответы [ 4 ]

0 голосов
/ 27 октября 2019

Я думаю, вы должны придерживаться своего первого «рабочего» решения, но используйте parse_url($url, PHP_URL_PATH) вместо $url напрямую:

<?php
    $url = parse_url("/parent/child?foo=bla&bar=bla", PHP_URL_PATH));
    // 1. Get URL
    $crumbs = explode("/", trim($url, '/'));
    // 2. Strip extras
    $build = '';
    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= '/'.$crumb;
        // format text 
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = "child";  

        echo $key < $lastKey
            ? "$crumb /" : $pagename;
    }
?>

Более подробную информацию о parse_url() см. В руководстве: https://www.php.net/manual/en/function.parse-url.php

0 голосов
/ 22 октября 2019

Как насчет удаления строки запроса из $ url .

<?php
    $url ="/parent/child/";
    $url_arr = parse_url($url);
    if(isset($url_arr['query'])){
    $query = $url_arr['query'];
    $url = str_replace(array($query,'?'), '', $url);
    }
    // 1. Get URL
    $crumbs = explode("/", trim($url, '/'));
    // 2. Strip extras
    $build = '';
    // 3. Define int so last item is not a link
    $lastKey = count($crumbs) - 1;
    // 4. Execute loop
    foreach($crumbs as $key => $crumb){
        $build .= '/'.$crumb;
        // format text
        $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
        $crumb = preg_replace('/-/', ' ', $crumb); // remove dashes
        $crumb = trim($crumb); // remove whitespace from before and after string

        $pagename = "parent";

        echo $key < $lastKey
            ? "$crumb   /" : $pagename;
    }
?>
0 голосов
/ 23 октября 2019

попробуй

$url = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
0 голосов
/ 17 октября 2019

Я думаю, что проблема в:

echo $key < $lastKey ? "$crumb /" : $pagename;

На шаге 3:

// 3. Define int so last item is not a link
$lastKey = count($crumbs) - 1;

Если у вас есть 3 элемента, $ lastKey будет2, потому что вы считаете 3 элемента и вычитаете 1.

Позже в цикле последний элемент будет находиться в ключе $ key = 2, поэтому:

$key = 2 < $lastKey = 2
...