Twee mannen zoeken item php i. Maak een aangepast berichttype (Custom Post Type) met aangepaste categorieën (Custom Taxonomy)

Van de auteur: Hallo vrienden. In dit artikel gaan we door met het implementeren van live zoeken voor de site. Wat is live zoeken? Je komt het de hele tijd tegen als je naar iets zoekt op Google of Yandex. Zodra u een zoekopdracht begint te typen, begint de zoekmachine u onmiddellijk opties aan te bieden, waaruit u alleen de meest geschikte kunt kiezen. Handig ding, nietwaar? Laten we proberen iets soortgelijks te implementeren.

U kunt de bronbestanden van het huidige artikel downloaden van . Het eerste deel van het artikel kun je vinden op.

Daarom hebben we in het eerste deel de database voorbereid die zal worden gebruikt voor live zoeken, en hebben we ook de Autocomplete-widget van de jQuery UI-bibliotheek aan het zoekveld op onze pagina toegevoegd. Voorlopig werkt de widget met testgegevens, maar nu gaan we dit oplossen.

Laten we eerst een andere gegevensbron voor de widget aangeven, dit is bijvoorbeeld het search.php-bestand, dat we ook moeten maken.

$(function())( $("#search").autocomplete(( bron: "search.php", )); ));

Nu typ ik een willekeurig teken in het zoekveld en kijk wat er in de browserconsole gebeurt.

Zoals u kunt zien, wordt een GET-verzoek verzonden met de term parameter, waarvan de waarde de string is die in het zoekveld is getypt. In dit geval gebeurt alles asynchroon, zonder de pagina opnieuw te laden, d.w.z. Er wordt gebruik gemaakt van AJAX.

Mooi, nu hoeft u alleen nog maar de binnenkomende zoekopdracht te accepteren en er een antwoord op te geven. Om dit te doen, moet u een verbinding tot stand brengen met de databaseserver en eenvoudige code schrijven die op verzoek gegevens uit de database ontvangt. De code in het search.php-bestand zal er ongeveer zo uitzien:

$db = mysqli_connect("localhost", "root", "", "world") or die("Geen verbinding met de database"); mysqli_set_charset($db, "utf8") or die("De verbindingscodering is niet ingesteld"); /** * zoeken automatisch aanvullen **/ function search_autocomplete())( global $db; $search = trim(mysqli_real_escape_string($db, $_GET["term"])); $query = "SELECTEER Naam VAN stad WAAR Naam LIKE " %($search)%" LIMIET 10"; $res = mysqli_query($db, $query); $result_search = array(); while($row = mysqli_fetch_assoc($res))( $result_search = array("label " => $row["Naam"]); return $result_search; ) if(!empty($_GET["term"]))( $search = search_autocomplete(); exit(json_encode($search)); )

$ db = mysqli_connect ("localhost" , "root" , "" , "world" ) of die ( "Geen verbinding met database") ;

mysqli_set_charset($db, "utf8") of die( "De verbindingscodering is niet ingesteld") ;

* zoeken naar automatisch aanvullen

functie zoeken_autocomplete() (

globaal$db;

$search = trim(mysqli_real_escape_string($db, $_GET["term"]));

$res = mysqli_query($db, $query);

$result_search = array();

while ($row = mysqli_fetch_assoc($res)) (

$result_search = array("label" => $row["Naam"]);

retourneer $result_search;

if (! leeg ($ _GET ["term"] ) ) (

$search = zoeken_autocomplete();

exit(json_encode($search));

Houd er rekening mee dat de functie search_autocomplete, die op verzoek gegevens ontvangt, deze gegevens in een bepaald formaat moet retourneren; het moet een array zijn met de labelsleutels en de waarden van de gevonden steden. Na het aanroepen van de functie moeten de gegevens worden geconverteerd naar JSON-formaat.

Het blijft nodig om de werking van onze live zoekopdracht te controleren. Om dit te doen, typen we, net als de vorige keer, slechts één letter: a:

Geweldig! Als reactie daarop ontvingen we een tiental steden waarvan de naam de ingevoerde letter bevatte. Als we doorgaan met het typen van de naam, verandert de lijst met opties, d.w.z. bij elke brief wordt een nieuw AJAX-verzoek verzonden.

In dit artikel laat ik zien hoe je kunt creëren menu met meerdere niveaus in PHP en MySQL. Natuurlijk kun je veel opties bedenken om het te maken, maar afgaande op het aantal vragen over dit onderwerp heb je een voorbeeld nodig. En ik zal het in dit artikel geven. Ik wil meteen opmerken dat dit artikel alleen zinvol is voor degenen die het weten PHP en weet van aanpakken MySQL. Alle anderen moeten dit eerst doornemen, of er wat boeken over lezen PHP en MySQL.

Laten we eerst een tabel in de database maken met de volgende velden:

  • Identiteitskaart- unieke identificatie.
  • titel- ankerlinks in het menu.
  • link- het adres waarnaar het menu-item zal leiden.
  • ouder_id- ouder-ID. Als er geen bovenliggend item is, is het NULL (of u kunt ook 0 invullen).

We hebben de tafel uitgezocht, nu is het tijd PHP-code. Vol PHP-code staat hieronder:

$mysqli = new mysqli("localhost", "root", "", "db"); // Maak verbinding met de database
$result_set = $mysqli->query("SELECT * UIT `menu`"); // Selecteer alle records uit de tabel met het menu
$items = array(); // Array voor menu-items
while (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // Vul de array met een voorbeeld uit de database
$kinderen = array(); // Array voor het matchen van onderliggende elementen met hun ouders
foreach ($items als $item) (
if ($item["parent_id"]) $childrens[$item["id"]] = $item["parent_id"]; // Vul de array
}
functie printItem($item, $items, $childrens) (
/* Geef het menu-item weer */
echo "

  • ";
    echo "".$item["titel"]."";
    $ul = onwaar; // Zijn er kinderen gerenderd?
    terwijl (waar) (
    /* Een oneindige lus waarin we naar alle kinderen zoeken */
    $key = array_search($item["id"], $childrens); // Op zoek naar een onderliggend element
    als (!$sleutel) (
    /* Geen kinderen gevonden */
    als ($ul) echo ""; // Als onderliggende elementen werden weergegeven, sluit dan de lijst
    pauze; // Verlaat de lus
    }
    niet ingesteld($childrens[$key]); // Verwijder het gevonden element (zodat het niet meer wordt weergegeven)
    als (!$ul) (
    echo "
      "; // Start de interne lijst als er nog geen onderliggende elementen zijn
      $ul = waar; // Zet de vlag
      }
      echo printItem($items[$key], $items, $childrens); // Geef recursief alle onderliggende elementen weer
      }
      echo "";
      }
      ?>

      Deze code werkt volledig, maar u moet begrijpen dat niemand op deze manier schrijft (in het bijzonder de uitvoer via echo HTML-tags). En jouw taak is om het algoritme uit deze code te halen, maar niet de code zelf. En koppel dit algoritme vervolgens aan uw motor. Ik heb geprobeerd de uitvoercode zorgvuldig te becommentariëren menu met meerdere niveaus in PHP en MySQL, maar het is natuurlijk niet het meest transparant en vereist een behoorlijk goede initiële kennis. Als je het nog steeds niet goed weet PHP en MySQL, dan raad ik je ten zeerste aan om deze eerst door te nemen

      Door Ibrahim Diallo

      Gepubliceerd 2 juli 2014 ~ 16 minuten gelezen

      Zoeken is een belangrijke functie op een website. Als mijn weinige lezers naar een bepaalde passage op mijn blog willen zoeken, gebruiken ze het zoekvak. Vroeger werd het mogelijk gemaakt door Google Zoeken, maar sindsdien heb ik het veranderd in mijn eigen, zelfgebrouwen versie, niet omdat ik het beter kan, maar omdat het een interessante uitdaging was.

      Als u haast heeft en wilt dat uw site doorzoekbaar is, doe dan wat ik eerder deed: gebruik Google.

      // In search.php-bestand $term = isset($_GET["query"])?$_GET["query"]: ""; $term = urlencode($term); $website = urlencode("www.uwwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("Locatie: $redirect"); Uitgang;

      Wat het doet is vrij eenvoudig. Zorg ervoor dat de term door de gebruiker wordt doorgegeven en stuur deze door naar de zoekpagina van Google. Beperk het zoekresultaat tot ons huidige domein met behulp van het site: trefwoord in de zoekopdracht. Al uw pagina's die door Google zijn geïndexeerd, zijn nu beschikbaar via zoeken. Als u uw zoektocht echter zelf wilt afhandelen, lees dan verder.

      Zelfgemaakte zoekoplossing

      Voordat we verder gaan, probeer het zoekvak op deze blog te gebruiken. Het gebruikt hetzelfde proces dat ik hieronder zal beschrijven. Als je denkt dat dit is wat je wilt, lees dan verder.

      Deze oplossing is bedoeld voor kleine websites. Ik maak gebruik van LIKE met jokertekens aan beide kanten, wat betekent dat uw zoekopdracht niet kan worden geïndexeerd. Dit betekent dat de oplossing prima zal werken voor uw blog of persoonlijke website die niet veel gegevens bevat. Porteer deze naar een grotere website en deze kan erg traag worden.

      Opmerking: Als je 5000 blogposts hebt, gaat het nog steeds goed. .

      We nemen de structuur van deze blog als referentie. Elke blogpost heeft:

      • Een titel p_title
      • Een url p_url
      • Een samenvatting p_summary
      • Een berichtinhoud p_content
      • En categorieën categorie.tagnaam

      Voor elk veld dat matcht met onze zoekterm geven wij een score. De score wordt gebaseerd op het belang van de wedstrijd:

      // de exacte term komt overeen met de titel $scoreFullTitle = 6; // match de titel in deel $scoreTitleKeyword = 5; // de exacte term komt overeen met de samenvatting $scoreFullSummary = 5; // match de samenvatting in deel $scoreSummaryKeyword = 4; // de exacte term komt overeen met de inhoud $scoreFullDocument = 4; // match het document in deel $scoreDocumentKeyword = 3; // komt overeen met een categorie $scoreCategoryKeyword = 2; // komt overeen met de url $scoreUrlKeyword = 1;

      Voordat we aan de slag gaan, zijn er een paar woorden die niet veel bijdragen aan een zoekopdracht die moeten worden verwijderd. Voorbeeld "in", "het", "een", "de", "van" ... . We zullen deze eruit filteren en voel je vrij om elk woord toe te voegen waarvan je denkt dat het niet relevant is. Een ander ding is dat we de lengte van onze zoekopdracht willen beperken. We willen niet dat een gebruiker een roman in het zoekveld schrijft en onze MySQL-server crasht.

      // Verwijder onnodige woorden uit de zoekterm en retourneer ze als een arrayfunctie filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // breid deze lijst uit met uw woorden $list = array("in", "it", "a", "de", "of", "ik", "jij", "hij", "ik", "ons", "zij", "zij", "maar", "dat", "dit", "die", "dan"); ", $query) as $key)( if (in_array($key, $list))( continue; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words ) // limit woorden aantal karakters functie limitChars($query, $limit = 200)( return substr($query, 0,$limit); )

      Onze helperfuncties kunnen nu het aantal tekens beperken en nutteloze woorden filteren. De manier waarop we ons algoritme zullen implementeren, is door elke keer dat we een match vinden een score te geven. We matchen woorden met behulp van de if-instructie en verzamelen punten naarmate we meer woorden matchen. Uiteindelijk kunnen we die score gebruiken om onze resultaten te sorteren

      Opmerking: Ik zal niet laten zien hoe je verbinding kunt maken met de MySQL-database. Als u problemen ondervindt bij het efficiënt verbinden met de database, raad ik u aan dit te lezen.

      Laten we onze functie eerst een structuur geven. Opmerking Ik heb tijdelijke aanduidingen achtergelaten, zodat we secties afzonderlijk kunnen implementeren.

      Functie zoeken($query)( $query = trim($query); if (mb_strlen($query)===0)( // geen lege zoekopdracht nodig toch? return false; ) $query = limitChars($query) ; // Scores wegen $scoreFullTitle = 5; $scoreFullKeyword = 4; $scoreDocumentKeyword = 2; filterSearchKeys( $escQuery = DB::escape($query); = array(); $docSQL = array( (); $urlSQL = array(); /** Overeenkomende volledige exemplaren PLACE HOLDER **/ /** Overeenkomende trefwoorden PLACE HOLDER **/ $sql = "SELECT p. p_id,p.p_title,p.p_date_published,p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Titelscore ".implode(" + ", $titleSQL).")+ (-- Samenvatting ".implode(" + ", $sumSQL) .")+ (-- document ".implode(" + ", $docSQL).")+ (-- tag/categorie ".implode(" + ", $ categorieSQL).")+ (-- url ". implode(" + ", $urlSQL).")) als relevantie FROM post p WHERE p.status = "gepubliceerd" HEBT relevantie >

      In de query worden alle scores samengevat als de relevantievariabele en kunnen we deze gebruiken om de resultaten te sorteren.

      Overeenkomende volledige gebeurtenissen

      We zorgen ervoor dat we eerst enkele zoekwoorden hebben en voegen vervolgens onze zoekopdracht toe.

      If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )

      Dat zijn de wedstrijden met een hogere score. Als de zoekterm overeenkomt met een artikel dat deze bevat, hebben ze een grotere kans om bovenaan te verschijnen.

      Overeenkomende trefwoorden

      We doorlopen alle trefwoorden en controleren of ze overeenkomen met een van de velden. Voor de categoriematch heb ik een subquery gebruikt, omdat een bericht meerdere categorieën kan hebben.

      Foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%.DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key).."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key).%",($scoreUrlKeyword),0)"; $categorySQL = "if ( (SELECTEER aantal(category.tag_id) VAN categorie JOIN post_category ON post_category.tag_id = categorie.tag_id WAAR post_category.post_id = p.post_id EN categorie.name = "".DB::escape($key).") > 0, ($scoreCategoryKeyword),0)"; )

      Zoals een commentator hieronder aangeeft, moeten we ervoor zorgen dat deze variabelen geen lege arrays zijn, anders mislukt de query.

      // Voor het geval dat het leeg is, voeg 0 toe if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (leeg($urlSQL))( $urlSQL = 0; ) if (leeg($tagSQL))( $tagSQL = 0; )

      Aan het einde worden de zoekopdrachten allemaal samengevoegd en opgeteld om de relevantie van het bericht voor de zoekterm te bepalen.

      // Verwijder onnodige woorden uit de zoekterm en retourneer ze als een arrayfunctie filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // breid deze lijst uit met uw woorden $list = array("in", "it", "a", "de", "of", "ik", "jij", "hij", "ik", "ons", "zij", "zij", "maar", "dat", "dit", "die", "dan"); ", $query) as $key)( if (in_array($key, $list))( continue; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words ) // limit woorden aantal karakters function limitChars($query, $limit = 200)( return substr($query, 0,$limit); ) function search($query)( $query = trim ($query); if (mb_strlen($query)===0)( // geen leeg zoekrecht nodig? return false; ) $query = limitChars($query); // Weegscores $scoreFullTitle = 6 $; scoreVolledigZoekwoord = 4; ")+ (-- Samenvatting ".implode(" + ", $sumSQL).")+ (-- document ".implode(" + ", $docSQL).")+ (-- tag/categorie ".implode (" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) als relevantie FROM post p WHERE p.status = "gepubliceerd" MET relevantie > 0 ORDER BY relevantie DESC,p.page_views DESC LIMIT 25";

      Nu kan uw search.php-bestand er als volgt uitzien:

      $term = isset($_GET["query"])?$_GET["query"]: ""; $search_results = zoeken($term); if (!$search_results) ( echo "Geen resultaten"; exit; ) // Print pagina met resultaten hier.

      We hebben een eenvoudig zoekalgoritme gemaakt dat een behoorlijke hoeveelheid inhoud aankan. Ik heb de score voor elke wedstrijd willekeurig gekozen, voel je vrij om deze aan te passen aan iets dat het beste voor jou werkt. En er is altijd ruimte voor verbetering.

      Het is een goed idee om de zoekterm van uw gebruikers bij te houden, op deze manier kunt u zien of de meeste gebruikers naar hetzelfde zoeken. Als er een patroon is, kunt u een reis voor hen opslaan en de resultaten gewoon in de cache opslaan met behulp van Gememoriseerd.

      Als je dit zoekalgoritme in actie wilt zien, ga je gang en zoek naar een artikel in het zoekvak bovenaan de pagina. Ik heb extra functies toegevoegd, zoals het retourneren van het gedeelte waar de overeenkomst in de tekst is gevonden. Voel je vrij om functies aan de jouwe toe te voegen.

      Vond je dit artikel leuk? Je kunt je abonneren om nog meer geweldige te lezen.

      .

      In verband hiermee zijn hier enkele interessante artikelen.

      Een paar maanden geleden heb ik mijn PHP-versie bijgewerkt. PHP 5.4 tot 5.5. Ik heb nog nooit problemen gehad met het updaten van PHP. Ik volg de ontwikkeling ervan op de voet en probeer mijn verouderde functies te verwijderen lang voordat ze officieel worden verwijderd. Maar deze keer werd ik overrompeld. Het brak stilletjes een deel van mijn website om de meest trieste reden.

      Opmerkingen(45)

      Zaryel 12 augustus 2015:

      Ian Mustafa 26 september 2015:

      Beroven 29 september 2015:

      geloof 11 februari 2016:

      Ivan Venediktov 9 april 2016.

      sjabloon

      De naam van de sjabloon waarmee zoekresultaten op de site moeten worden weergegeven. Genegeerd in de XSLT-sjabloonengine.

      Zoek_tekenreeks

      Zoek zin. Als de waarde niet is opgegeven, wordt deze overgenomen uit het verzoek dat via het zoekformulier is verzonden.

      Zoektypen

      Lijst met hiërarchische type-ID's voor zoeken (gespecificeerd gescheiden door een spatie). Als de waarde niet is opgegeven, wordt er op alle typen gezocht.

      Zoek_filialen

      Lijst met secties waarin de zoekopdracht zal worden uitgevoerd (aangegeven door een spatie). Als de waarde niet is opgegeven, wordt er in alle secties gezocht. De parameter kan zowel pagina-ID's als hun URL's accepteren.

      Per_pagina

      Aantal resultaten per pagina. Als de parameter niet is opgegeven, wordt de waarde gebruikt die is opgegeven in de instellingen van de module "Zoeken".

      %totaal%

      Toont het totale aantal nieuwsitems in de feed. Kan gebruikt worden voor macro %systeemnummers()%.

      %per_pagina%

      Geeft de waarde van de parameter per_page weer. Kan gebruikt worden voor macro %systeemnummers()%.

      %lijst-klasse-eerste%

      als het element het eerste is, wordt "eerste" uitgevoerd

      %lijst-klasse-laatste%

      als het element het laatste is, wordt "laatste" uitgevoerd

      %lijst-klasse-oneven%

      als het element even is, wordt "oneven" afgedrukt

      %list-class-even%

      als het element oneven is, wordt "even" afgedrukt

      %lijstpositie%

      voegt een serienummer in de lijst in

      zoek_leeg_resultaat

      Wordt gebruikt als er geen pagina's zijn gevonden als resultaat van de zoekopdracht. In dit geval wordt dit blok uitgevoerd in plaats van het blok zoek_blok .

      %last_search_string%

      Geeft de vorige zoekopdracht weer, als die er was.

      zoek_block_line_quant

      Voert een scheidingsteken uit dat tussen de zoekresultaten wordt ingevoegd.

      Voorbeelden van gebruik

      %totaal% pagina's gevonden.

      %regels%

      %systeemaantallen(%total%, %per_page%)%

      EINDE; $FORMS ["zoek_blok_lijn" ] =<< %num%. %naam%%context%

      EINDE; $FORMS ["search_empty_result" ] =<<Sorry. Er is niets gevonden voor dit verzoek.

      EINDE; ?>

  •