✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Sök inläggsmetadata i WordPress Admin Area

32

Efter att du har arbetat med WordPress under en längre tid är det troligt att du har arbetat med inläggsmetadata i viss kapacitet. Kanske har du helt enkelt läst metadata från databasen, eller kanske har du både skrivit till och läst från databastabellen också.

Det kan vara ett riktigt kraftfullt API närhelst du behöver associera viss information med dina inlägg (eller, om du gillar att abstrahera saker ännu mer, till dina modeller).

Som sagt, vad händer när du vill inkludera information från metadatatabellen men inte har bekvämligheten med plugins som SearchWP eller Relevanssi?

Anta dessutom att användningsfallet bara är för administratörer och att det bara är för administrationsområdet för WordPress. Det vill säga att du vill söka i dina inlägg från skärmen Alla inlägg men du vill också inkludera inläggets metadata i sökkriterierna.

Vad händer då?

Sök inläggsmetadata

När du söker efter inlägg i WordPress-administrationsområdet, kommer den att leta efter en fras i inläggets titel, inläggsutdrag och inläggsinnehåll och returnerar sedan dessa resultat.

Så för att utöka sökningen till att inkludera postmetadata måste vi uppdatera frågan som körs så att den innehåller postmetadatatabellerna. Men det är mer än så. Specifikt, för största möjliga flexibilitet och bästa användarupplevelse, vill du:

  • inkludera delar av en fras så att den inte bara letar efter något ordagrant i artikeln,
  • och naturligtvis hantera fallet om ingen sökterm anges så att skärmen Alla inlägg fortfarande kan ses i sitt standardformat.

Det betyder att vi inte bara behöver modifiera sökfrågan så att den inkluderar en meta-nyckel och ett metavärde, utan vi måste undvika hela fraser på rätt sätt så att vi kan använda en LIKEoperation snarare än en INoperation eller =operation.

Sök inläggsmetadata i WordPress Admin Area

Några av de saker som är viktiga att veta innan du läser resten av den här artikeln är:

I slutändan kommer vi att behöva använda två krokar med två anpassade funktioner. Och eftersom jag inte kan ge ett komplett exempel på hur detta kan se ut i ditt användningsfall, måste koden vara lite generaliserad.

Hakar på Sök

I följande sammanfattning kommer du att se tre saker:

  1. Verifiering att användaren är på administrationsområdet och att de finns på redigeringssidan.
  2. Användaren har gjort en sökning.
  3. Sökfrasen har konverterats till en array, escaped och lagts till i meta-frågeegenskapen för instansen av WP_Query.

Se nedan :

<?php
add_filter('pre_get_posts', function ($query) {

    // Make sure we're in the admin, an administrator, and on the edit page.
    if (!is_admin() || !current_user_can('manage_options') || 'edit' !== get_current_screen()->base) {
        return;
    }

    // Determine if the user is running a search.
    $search = filter_input(INPUT_GET, 's', FILTER_SANITIZE_STRING);
    if (empty($search)) {
        return;
    }

    $query->set(
        'meta_query',
        [
            [
                'key'     => 'headline_notes',
                'value'   => esc_sql(preg_replace('/s+?/', '%', $search)), // For flexible search, make sure to replace all white space with % for LIKE.
                'compare' => 'LIKE',
            ],
        ]
    );
});

Förutsatt att allt ovan är sant kommer detta att uppdatera frågan som körs mot WordPress-databasen innan nästa sida renderas så att resultat som inkluderar metadatainformationen.

Uppdatering av WHERE-klausulen

Innan vi är klara måste vi dock också se till att vi har uppdaterat frågan som körs.

Som standard är frågan byggd med hjälp av en ANDoperation och som hindrar oss från att titta ordentligt igenom inläggstitlar, utdrag, innehåll och metadata; frågan måste dock uppdateras så att den använder en ORoperation.

Helt bokstavligen betyder det att det kommer att se ut i titeln, innehållet, utdraget eller metadata.

Jag har valt att använda ett reguljärt uttryck i min implementering, men din implementering kan fungera med att ersätta delsträngar. Därför är det lite kommenterat för att ge dig mest flexibilitet.

<?php
add_filter( 'posts_where', function($where, $query) {

    // Determine if 'headline_notes' appears in the WHERE clause.
    $position = strpos($where, 'acme_meta_key');
    if (false === $position) {
        return $where;
    }

    // Look for the 'AND' clasue and replace it with 'OR' in the WHERE clause.
    $regularExpress = '//mi'; // Your regular expression.
    $replacement = ''; // Your string to replace.

    return preg_replace(
        $regularExpression,
        $replacement,
        $where
    );
}, 10, 2);

Detta uppdaterar WHEREklausulen som aktiveras för att slutföra arbetsuppsättningen i den inledande delen av artikeln där vi lägger till metadata.

Det finns andra sätt

Observera att det finns några otroligt flexibla sätt att arbeta med WP_Query för att få de resultat du behöver. Och din implementering kommer att variera beroende på vad det är du gör.

Så betrakta detta som ett av många sätt som kan användas; vet dock att om du har:

  1. en enda nyckel,
  2. ett värde (eller ett värde som kan delas upp i en matris),
  3. och du vill söka efter metadata vid sidan av det traditionella inläggsinnehållet

Då kommer detta att fungera.

Inspelningskälla: tommcfarlin.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer