{"id":231912,"date":"2022-12-27T11:59:00","date_gmt":"2022-12-27T08:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231912"},"modified":"2022-12-27T12:29:55","modified_gmt":"2022-12-27T09:29:55","slug":"query-al-database-per-aggiornare-rapidamente-i-dati-parte-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/query-al-database-per-aggiornare-rapidamente-i-dati-parte-2\/","title":{"rendered":"Query al database per aggiornare rapidamente i dati, parte 2"},"content":{"rendered":"\n<p>Questa \u00e8 la seconda e ultima parte di una serie sulle query dirette al database, come suggerisce il titolo. In particolare, si tratta di modificare lo stato dei post (ma \u00e8 rilevante per pi\u00f9 di questo).<\/p>\n<p>Foto di Ross Findon su Unsplash<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/it\/query-al-database-per-aggiornare-rapidamente-i-dati-parte-1\/\" title=\"Dal post precedente:\">Dal post precedente:<\/a><\/p>\n<blockquote>\n<p>Questo \u00e8 un altro post che sar\u00e0 un&#8217;illustrazione di come utilizzare $ wpdb per aggiornare rapidamente le informazioni in base ai metadati.<\/p>\n<\/blockquote>\n<p>E il codice fornito in quel post funziona, ma se stai cercando di renderlo pi\u00f9 orientato agli oggetti, allora c&#8217;\u00e8 pi\u00f9 lavoro che pu\u00f2 essere fatto.<\/p>\n<p>Prima di passare al post vero e proprio, tuttavia, \u00e8 importante notare che quando si tratta di programmazione orientata agli oggetti, c&#8217;\u00e8 molto lavoro che pu\u00f2 essere svolto nella progettazione della classe e nella creazione di livelli di astrazione.<\/p>\n<p>Ad un certo punto, devi tracciare il proverbiale confine tra quando utilizzerai le interfacce, quanto saranno granulari le tue classi in termini di ci\u00f2 che stanno astraendo e simili.<\/p>\n<p>E lo scopo di questo post \u00e8 aiutare a fornire un migliore design orientato agli oggetti, ma non \u00e8 un esercizio renderlo il pi\u00f9 ottimale possibile. Discuto argomenti come questo in <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un&#8217;altra serie di post<\/a>.<\/p>\n<p>Ma tienilo a mente quando leggi il codice per tutto il resto del post.<\/p>\n<h2>Query al database per aggiornare rapidamente i dati, parte 2<\/h2>\n<p>Dato dove ci siamo lasciati, abbiamo una singola funzione che fa le seguenti cose:<\/p>\n<ol>\n<li>recuperare tutti i post associati a una specifica meta chiave,<\/li>\n<li>determinare se dobbiamo uscire presto,<\/li>\n<li>aggiornare lo stato del post di eventuali post esistenti.<\/li>\n<\/ol>\n<p>La prima cosa da notare \u00e8 che una singola funzione \u00e8 eccessiva, quindi deve essere suddivisa in diverse altre funzioni. E poich\u00e9 \u00e8 orientato agli oggetti, dobbiamo assicurarci che qualsiasi cosa stia facendo una funzione non sia necessariamente basata su passaggi precedenti: \u00e8 esattamente di questo che si tratta la programmazione procedurale.<\/p>\n<p>Utilizzeremo invece questa opportunit\u00e0 per impostare le funzioni, in modo che operino su qualsiasi dato venga loro passato, indipendentemente da come sono arrivate.<\/p>\n<p>Infine, spetta a te, come sviluppatore, determinare se desideri avere una singola classe per fare questo, pi\u00f9 di una classe, o avere un insieme di classi correlate che ereditano da una classe genitore.<\/p>\n<p>Ancora una volta, \u00e8 tutto su quanto astratto vuoi rendere il codice.<\/p>\n<p>Per ora, per\u00f2, andiamo avanti con la rottura delle cose.<\/p>\n<h3>1 Prendi gli ID Post con la Meta Key associata<\/h3>\n<p>Proprio come nel primo post, vogliamo assicurarci di recuperare gli ID post correlati a una meta chiave specifica.<\/p>\n<p>Per rendere questa funzione il pi\u00f9 flessibile possibile, la configureremo su:<\/p>\n<ul>\n<li>accetta la meta chiave come una stringa,<\/li>\n<li>restituire una matrice<\/li>\n<\/ul>\n<p>La funzione sar\u00e0 quindi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">simile a questa:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Locates all of the post IDs that are associated with an empty meta key (which\n * is specified as an argument for the function).\n *\n * @param string $metaKey The meta key used to retrieve the set of post IDs.\n * @return array $results The set of product IDs associated with the specified meta key.\n *\/\npublic function getInactivePostIds(string $metaKey): array\n{\n    global $wpdb;\n\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            $metaKey) );\n\n    return $results;\n}<\/code><\/pre>\n<p>Nel primo post, abbiamo suddiviso questo in tre passaggi (che sono anche descritti sopra). Qui, tuttavia, possiamo combinare il secondo e il terzo passaggio in un&#8217;unica funzione.<\/p>\n<h3>2 Aggiorna lo stato del post<\/h3>\n<p>Come ho gi\u00e0 detto, l&#8217;unico aspetto della programmazione orientata agli oggetti \u00e8 assicurarsi che le funzioni che stiamo utilizzando siano indipendenti da come sono stati generati i dati che stanno ricevendo.<\/p>\n<p>Al contrario, hanno un unico algoritmo da eseguire per concentrarsi sui dati passati nella funzione. In questo caso, vogliamo prendere la serie di risultati, che sono ID post, e aggiornare lo stato del post in modo che sia impostato su <strong>bozza<\/strong>.<\/p>\n<p>Ci\u00f2 significa che la funzione accetter\u00e0 un array ma non restituir\u00e0 nulla. Potenzialmente, potresti tenere traccia di molti post che ha aggiornato (o se ha aggiornato qualcosa), ma mi concentro solo sul refactoring del codice che gi\u00e0 abbiamo.<\/p>\n<p>Quindi \u00e8 quello che faremo. E la prima cosa \u00e8 assicurarsi che ci siano dati effettivi con cui lavorare. In tal caso, scorrere l&#8217;array elenco di ID post e <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modificare lo stato del post:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Updates incoming posts by setting their post status to 'draft.'\n *\n * @param array $postData the set of post IDs associated with the specific meta key.\n *\/\npublic function setPostsToDraft(array $postData)\n{\n    \/\/ If the post data is empty, there's nothing to do.\n    if (0 === count($postData)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    global $wpdb;\n    foreach ($postData as $post) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($post-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Puoi vedere che non \u00e8 molto diverso dal lavoro svolto nel primo post, ma ora solleva alcune domande.<\/p>\n<h3>3 Considerazioni orientate agli oggetti<\/h3>\n<p>Quando si lavora con codice come questo:<\/p>\n<ul>\n<li>Appartiene tutti alla stessa classe oa classi separate?<\/li>\n<li>Dovrebbe esserci una classe base e, se s\u00ec, perch\u00e9 o perch\u00e9 no?<\/li>\n<li>Dovrebbe esserci una singola funzione pubblica invocata che chiama questi metodi (e li ha contrassegnati come privati)?<\/li>\n<li>Dobbiamo lasciare pubbliche le funzioni?<\/li>\n<\/ul>\n<p>Per questo post, far\u00f2 quanto segue:<\/p>\n<ul>\n<li><strong>Esponi ogni funzione come metodo pubblico<\/strong>. Questo \u00e8 cos\u00ec che se ci sono dati restituiti dal primo metodo, potresti potenzialmente fare qualcos&#8217;altro con esso.<\/li>\n<li><strong>Tienilo contenuto in un&#8217;unica classe<\/strong>. In questo modo, possiamo creare un&#8217;istanza di una singola classe e quindi usarla per fare qualsiasi lavoro dobbiamo fare. Se ci fossero altri metodi, useremmo quegli stessi metodi.<\/li>\n<li><strong>Inizia con l&#8217;interfaccia<\/strong>. Non mi preoccuper\u00f2 di scrivere un&#8217;interfaccia solo per mostrare un&#8217;interfaccia (presumo sia abbastanza facile da dedurre date le funzioni che abbiamo in questo momento), ma prender\u00f2 la classe e mostrer\u00f2 come possiamo invocare il funzioni &#8220;dall&#8217;esterno verso l&#8217;interno&quot;.<\/li>\n<\/ul>\n<p>Quindi inizier\u00f2 con <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;ultimo punto<\/a> e lavorer\u00f2 a ritroso. Ecco un modo per lavorare con il codice:<\/p>\n<pre><code>&lt;?php\n\n$postStatusModifier = new PostStatusModifier();\n$inactivePost = $postStatusModifier-&gt;getInactivePostIds('acme-status');\n$postStatusModifier-&gt;setPostsToDraft($inactivePosts);<\/code><\/pre>\n<p>E poi ecco come appare <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;intera classe :<\/a><\/p>\n<pre><code>&lt;?php\n\nclass PostStatusModifier\n{\n    \/**\n     * Locates all of the post IDs that are associated with an empty meta key (which\n     * is specified as an argument for the function).\n     *\n     * @param string $metaKey The meta key used to retrieve the set of post IDs.\n     * @return array $results The set of product IDs associated with the specified meta key.\n     *\/\n    public function getInactivePostIds(string $metaKey): array\n    {\n        global $wpdb;\n\n        $results = $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                SELECT post_id\n                FROM $wpdb-&gt;postmeta\n                WHERE meta_key = %s\n                AND meta_value = ''\n                \",\n                $metaKey) );\n\n        return $results;\n    }\n\n    \/**\n     * Updates incoming posts by setting their post status to 'draft.'\n     *\n     * @param array $postData the set of post IDs associated with the specific meta key.\n     *\/\n    public function setPostsToDraft(array $postData)\n    {\n        \/\/ If the post data is empty, there's nothing to do.\n        if (0 === count($postData)) {\n            return;\n        }\n\n        \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n        global $wpdb;\n        foreach ($postData as $post) {\n            $wpdb-&gt;get_results(\n                $wpdb-&gt;prepare(\n                    \"\n                    UPDATE $wpdb-&gt;posts\n                    SET post_status = %s\n                    WHERE ID = %d\n                    \",\n                    'draft',\n                    (int) ($post-&gt;post_id)) );\n        }\n    }\n}<\/code><\/pre>\n<p>In generale, servir\u00e0 agli stessi scopi del primo ma in un modo pi\u00f9 orientato agli oggetti.<\/p>\n<h2>Non \u00e8 cos\u00ec<\/h2>\n<p>Come ho provato a ripetere pi\u00f9 volte in questo post, questo non \u00e8 il modo definitivo per fare questo lavoro. Invece, \u00e8 un modo in cui il lavoro pu\u00f2 essere svolto.<\/p>\n<p>Puoi riprogettare, rifattorizzare o riutilizzarlo come meglio credi. Lo scopo, tuttavia, \u00e8 mostrare come disaccoppiare la logica che normalmente vediamo come procedurale in qualcosa che \u00e8 un po&#8217; meno dipendente da se stesso e lascia spazio a un lavoro aggiuntivo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Utilizzo dei principi orientati agli oggetti per migliorare la progettazione delle classi per la scrittura di query di database per aggiornare rapidamente i dati.<\/p>\n","protected":false},"author":1,"featured_media":237043,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,896,835,720,844],"tags":[1168],"class_list":["post-231912","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-guida-per-principianti","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231912","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231912"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231912\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231912"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231912"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}