Verifică dacă Titlul Postării există, Inserează postarea dacă nu există, Adaugă Număr Incremental la Meta dacă există

15 iul. 2012, 21:58:08
Vizualizări: 37.5K
Voturi: 14

Am deja o funcție unde un utilizator trimite un formular și creează o postare personalizată...

<?php 
$postTitle = $_POST['post_title'];
$submit = $_POST['submit'];

if(isset($submit)){
    global $user_ID;
    
    // Verifică dacă există deja o postare cu acest titlu
    $existing_post = get_page_by_title($postTitle, OBJECT, 'stuff');
    
    if(!$existing_post) {
        // Creează postare nouă dacă titlul nu există
        $new_post = array(
            'post_title' => $postTitle,
            'post_content' => '',
            'post_status' => 'publish',
            'post_date' => date('Y-m-d H:i:s'),
            'post_author' => '',
            'post_type' => 'stuff',
            'post_category' => array(0)
        );
        
        $post_id = wp_insert_post($new_post);
        add_post_meta($post_id, 'times', '1');
    } else {
        // Incrementează valoarea meta dacă postarea există
        $times = get_post_meta($existing_post->ID, 'times', true);
        $times = ($times) ? $times + 1 : 1;
        update_post_meta($existing_post->ID, 'times', $times);
    }
}

Vreau să verific dacă titlul postării personalizate există, apoi dacă NU există, să creez postarea cu #1 în câmpul meta, iar dacă există deja, să adaug doar 1 la câmpul meta

0
Toate răspunsurile la întrebare 6
1
12

O metodă mai actualizată poate folosi funcția post_exists() astfel:

if( isset( $_POST['submit'] ) ){

   $post_title = sanitize_title( $_POST['post_title'] );

   $new_post = array(
       'post_title' => $post_title,
       'post_content' => '',
       'post_status' => 'publish',
       'post_date' => date('Y-m-d H:i:s'),
       'post_author' => '',
       'post_type' => 'stuff',
       'post_category' => array(0)
   );

   $post_id = post_exists( $post_title ) or wp_insert_post( $new_post );

   update_post_meta( $post_id, 'times', '1' );

}
29 nov. 2017 07:19:14
Comentarii

Nu este foarte clar dacă OP dorea să incrementeze câmpul meta cu 1 dacă postarea există, sau pur și simplu să seteze câmpul meta la 1. Codul de mai sus va seta întotdeauna valoarea la 1. Pentru a incrementa, $post_id = post_exists[...] operatorul ternar ar trebui descompus într-un if / else pentru a incrementa câmpul meta.

Tim Hallman Tim Hallman
8 nov. 2018 21:50:18
8

Aceasta ar necesita o interogare.

Deci, construind pe codul tău:

<?php
$postTitle = $_POST['post_title'];
$submit = $_POST['submit'];

if(isset($submit)){

    global $user_ID, $wpdb;

    $query = $wpdb->prepare(
        'SELECT ID FROM ' . $wpdb->posts . '
        WHERE post_title = %s
        AND post_type = \'stuff\'',
        $postTitle
    );
    $wpdb->query( $query );

    if ( $wpdb->num_rows ) {
        $post_id = $wpdb->get_var( $query );
        $meta = get_post_meta( $post_id, 'times', TRUE );
        $meta++;
        update_post_meta( $post_id, 'times', $meta );
    } else {
        $new_post = array(
            'post_title' => $postTitle,
            'post_content' => '',
            'post_status' => 'publish',
            'post_date' => date('Y-m-d H:i:s'),
            'post_author' => '',
            'post_type' => 'stuff',
            'post_category' => array(0)
        );

        $post_id = wp_insert_post($new_post);
        add_post_meta($post_id, 'times', '1');
    }
}

Ar trebui să funcționeze

16 iul. 2012 00:08:14
Comentarii

Poți dori să adaugi AND post_status = 'publish' la interogarea inițială pentru a returna doar postările publicate.

Barry Carlyon Barry Carlyon
16 iul. 2012 00:09:21

Mulțumesc din nou pentru ajutor! Totuși, postările nu ajung în bază de date din nu știu ce motiv.. nici cele noi, nici cele actualizate.

marctain marctain
16 iul. 2012 02:28:53

Este vreo greșeală de scriere pe undeva? Nu reușesc să îmi dau seama.

marctain marctain
16 iul. 2012 06:32:22

Voi face un test când mă voi întoarce de la serviciu acasă

Barry Carlyon Barry Carlyon
16 iul. 2012 13:48:15

Eșec epic din partea mea WHERE post_title = %d ar trebui să fie WHERE post_title = %s bătându-mă cu capul de birou

Barry Carlyon Barry Carlyon
16 iul. 2012 22:10:22

Se întâmplă și celor mai buni! Ok, deci noile postări sunt adăugate acum, dar valoarea meta pentru "times" nu se incrementează. În schimb, este creată o nouă valoare meta numită "2". Nici ea nu se auto-incrementează.

marctain marctain
16 iul. 2012 22:18:46

Ups, am uitat să actualizez și acea linie. update_post_meta( $post_id, $meta ); ar trebui să fie update_post_meta( $post_id, 'times', $meta );

Barry Carlyon Barry Carlyon
16 iul. 2012 22:19:58

Ah, are sens! Ar fi trebuit să observ și asta. Mulțumesc mult. Victorie epică pentru tine!

marctain marctain
16 iul. 2012 22:21:19
Arată celelalte 3 comentarii
1

Puteți utiliza funcția get_page_by_title() din WordPress:

<?php $postTitle = $_POST['post_title'];
$submit = $_POST['submit'];


if(isset($submit)){
    $customPost = get_page_by_title($postTitle, OBJECT, 'stuff');

    if(!is_null($customPost)) {
       $meta = get_post_meta($customPost->ID, 'times', true);
       $meta++;
       update_post_meta($customPost->ID, 'times', $meta);

       return
    }

    global $user_ID;

    $new_post = array(
        'post_title' => $postTitle,
        'post_content' => '',
        'post_status' => 'publish',
        'post_date' => date('Y-m-d H:i:s'),
        'post_author' => '',
        'post_type' => 'stuff',
        'post_category' => array(0)
    );

    $post_id = wp_insert_post($new_post);
    add_post_meta($post_id, 'times', '1');

}
16 mai 2016 12:57:03
Comentarii

Salut Alex, bine ai venit pe WPSE. Te încurajăm să faci turul. Aici susținem principiul de a-i învăța pe oameni cum să pescuiască, nu doar să le dăm peștele gata. Ai putea, te rog, să editezi postarea ta și să adaugi o explicație despre cum soluția ta rezolvă problema OP-ului?

Tim Malone Tim Malone
16 mai 2016 13:27:26
1

@Tim Hallman răspuns bun. Folosește funcția post_exists() pentru a verifica dacă postarea există sau nu. Pentru mai multe detalii, vizitează https://developer.wordpress.org/reference/

documentație pentru dezvoltatori

20 mar. 2018 13:13:49
Comentarii

Pentru a utiliza această funcție în partea de frontend, este necesară o anumită muncă.

Tami Tami
10 iun. 2021 02:44:06
1

Puteți face acest lucru după ID


$post_title = "Acest Titlu Minunat";
$post_content = "Conținutul meu despre ceva interesant.";
$post_status = "publish"; //publish, draft, etc
$post_type = "page" // sau orice alt tip de postare dorit

/* Încercare de a găsi ID-ul postării după titlu, dacă există */
$found_post_title = get_page_by_title( $post_title, OBJECT, $post_type );
$found_post_id = $found_post_title->ID;

/**********************************************************
** Verifică dacă pagina nu există, dacă este adevărat, creează o nouă postare
************************************************************/
if ( FALSE === get_post_status( $found_post_id ) ): 

      $post_args = array(
        'post_title' => $post_title,
        'post_type' => $post_type,
        'post_content'=> $post_content,
        'post_status'  => $post_status,
        //'post_author'  => get_current_user_id(),

        /* Dacă aveți câmpuri meta în care să introduceți date */ 
        'meta_input'   => array(
            'meta_key1' => 'valoarea mea',
            'meta_key2' => 'cealaltă valoare a mea',
        ),
      );      

      /* Adaugă o nouă postare WordPress în baza de date, returnează ID-ul postării */
      $returned_post_id = wp_insert_post( $post_args );  

      /* Actualizează șablonul paginii doar dacă folosiți "page" ca tip de postare */ 
      update_post_meta( $returned_post_id, '_wp_page_template', 'my-page-template.php' ); 

      /* Adaugă valori în câmpurile meta. Funcționează cu CÂMPURI PERSONALIZATE ACF!! */
      $field_key = "Cheia_Câmpului_Meu";
      $value = "valoarea mea personalizată";
      update_field( $field_key, $value, $returned_post_id );

      $field_key = "Cheia_Altuia_Câmp_Meu";
      $value = "cealaltă valoare personalizată";
      update_field( $field_key, $value, $returned_post_id );

      /* Salvează o valoare de tip checkbox sau select */
      // $field_key = "Cheia_Câmpului_Meu";
      // $value = array("roșu", "albastru", "galben");
      // update_field( $field_key, $value, $returned_post_id );

      /* Salvează o valoare într-un câmp repetitor */
      // $field_key = "Cheia_Câmpului_Meu";
      // $value = array(
      //   array(
      //     "ss_nume" => "Foo",
      //     "ss_tip" => "Bar"
      //   )
      // );
      // update_field( $field_key, $value, $returned_post_id );

      /* Afișează un răspuns! */
      echo "<span class='pg-new'><strong>". $post_title . " Creat!</strong></span><br>";
      echo "<a href='".esc_url( get_permalink($returned_post_id) )."' target='_Blank'>". $post_title . "</a><p>";


else:        
/***************************
** DACĂ POSTAREA EXISTĂ, actualizează-o
****************************/

      /* Actualizează postarea */
      $update_post_args = array(
        'ID'           => $found_post_id,
        'post_title'   => $post_title,
        'post_content' => $post_content,
      );

      /* Actualizează postarea în baza de date */
      wp_update_post( $update_post_args );

      /* Actualizează valorile în câmpurile meta */
      $field_key = "Cheia_Câmpului_Meu";
      $value = "valoarea mea personalizată";
      update_field( $field_key, $value, $found_post_id );

      $field_key = "Cheia_Altuia_Câmp_Meu";
      $value = "cealaltă valoare personalizată";
      update_field( $field_key, $value, $found_post_id );

      /* Afișează un răspuns! */
      echo "<span class='pg-update'><strong>". $post_title . " Actualizat!</strong></span><br>"; 
      echo "<a href='".esc_url( get_permalink($found_post_id) )."' target='_Blank'>Vezi</a> | <a href='post.php?post=".$found_post_id."&action=edit'>". $post_title . "</a><p>";

endif;

10 feb. 2019 23:53:23
Comentarii

De fapt, este mai sigur să utilizezi cele 2 funcții încorporate în WP care sunt destinate să facă acest lucru, post_exists și wp_insert_post, așa cum este în răspunsul lui @TimHallman. Cu cât introduci mai mult cod inutil, cu atât crește șansa de a introduce erori sau probleme de întreținere pe termen lung.

FluffyKitten FluffyKitten
23 feb. 2019 19:57:55
0
-1

WordPress verifică dacă un articol există după titlu

function wp_exist_post_by_title( $title ) {
    global $wpdb;
    $return = $wpdb->get_row( "SELECT ID FROM wp_posts WHERE post_title = '" . $title . "' && post_status = 'publish' && post_type = 'post' ", 'ARRAY_N' );
    if( empty( $return ) ) {
        return false;
    } else {
        return true;
    }
}

// utilizare
if( wp_exist_post_by_title( $post->name ) ) {
// articolul există
} else { 
// articolul nu există
}
13 apr. 2015 16:51:40