Formulari per inserir contingut al CMS
Contingut
Introducció
Inserir un post al Wordpress
Recordem quines són les taules del wordpress:
$ show tables mysql> show tables; +-----------------------+ | Tables_in_wordpress20 | +-----------------------+ | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_usermeta | | wp_users | +-----------------------+
I quins són els camps de lahttp://www.thinkoholic.com/2018/05/30/how-to-insert-article-wordpress-database-mysql/ taula principal, wp_posts:
mysql> desc wp_posts; +-----------------------+---------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------------+------+-----+---------------------+----------------+ | ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | post_author | bigint(20) unsigned | NO | MUL | 0 | | | post_date | datetime | NO | | 0000-00-00 00:00:00 | | | post_date_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content | longtext | NO | | NULL | | | post_title | text | NO | | NULL | | | post_excerpt | text | NO | | NULL | | | post_status | varchar(20) | NO | | publish | | | comment_status | varchar(20) | NO | | open | | | ping_status | varchar(20) | NO | | open | | | post_password | varchar(255) | NO | | | | | post_name | varchar(200) | NO | MUL | | | | to_ping | text | NO | | NULL | | | pinged | text | NO | | NULL | | | post_modified | datetime | NO | | 0000-00-00 00:00:00 | | | post_modified_gmt | datetime | NO | | 0000-00-00 00:00:00 | | | post_content_filtered | longtext | NO | | NULL | | | post_parent | bigint(20) unsigned | NO | MUL | 0 | | | guid | varchar(255) | NO | | | | | menu_order | int(11) | NO | | 0 | | | post_type | varchar(20) | NO | MUL | post | | | post_mime_type | varchar(100) | NO | | | | | comment_count | bigint(20) | NO | | 0 | | +-----------------------+---------------------+------+-----+---------------------+----------------+ 23 rows in set (0.01 s
A l'hora de fer un insert directament amb la consola de SQL, és important tenir clar quins són els camps obligatoris (en aquest cas, tots els valors són no-nuls, per tant, seran obligatoris). I hi ha camps que tenen valor per defecte.
També és important saber el valor actual del ID del post, doncs l'entrada següent haurà de ser ID+1:
mysql> select max(ID) from wp_posts; +---------+ | max(ID) | +---------+ | 285 | +---------+
Així doncs, un insert mínim que funciona per insertar un post des de la consola mysql seria:
mysql> INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, guid, post_type, comment_count) VALUES (286, 1, '2020-04-27 13:00:00', '2020-04-27 13:00:00', 'Nou post a partir d''un insert SQL', 'insert post SQL', 'excerpt', 'publish', 'open', 'open', 'insert-post-SQL', '', '', '2020-04-27 13:00:00', '2020-04-27 13:00:00', '', 'http://www.mapesoberts.cat/index.php/2020/04/27/insert-post-SQL/', 'post', 0);
És important no equivocar-se amb la sintaxi.
Que hàgim fet el insert no vol dir que el post sigui visible en el bloc. Per exemple, és important que el post pertanyi a alguna categoria, per exemple la categoria 'General':
mysql> select * from wp_terms; +---------+-------------------------+-------------------------+------------+ | term_id | name | slug | term_group | +---------+-------------------------+-------------------------+------------+ | 1 | General | general | 0 | | 2 | OpenStreetMaps | openstreetmaps | 0 | | 3 | Google Maps | google-maps | 0 | | 4 | Món mapping | mon-mapping | 0 | ...
La taula wp_term_relationships relaciona els posts amb els termes de les categoris. Per tant, si volem que el nostre post pertanyi a la categoria general:
mysql> INSERT INTO `wp_term_relationships` (`object_id`, `term_taxonomy_id`) VALUES (286, 1);
I ara ja podem veure el nostre post en el bloc (i en la zona d'administració).
Codi PHP
Ara que ja sabem introduir un post des de la consola, es tracta de fer un formulari PHP per tal d'introduir posts des d'un formulari PHP. El codi que aquí es presenta és molt similar al que ja havíem estudiat en el seu dia. Anem a repassar-lo. En el seu dia vam fer un formulari de contactes, basat en el disseny de bootstrap:
Bàsicament farem el mateix, però la part de bootstrap l'eliminarem, doncs ens centrem només en el formulari i en el PHP.
Insert
L'objectiu és tenir un formulari que quan fem el submit faci un insert al nostre bloc.
Per construir el insert prenem les següents decisions, que pot veure estudiant el codi:
- ID: hem de cercar el max(ID), i sumar-li un.
- el post_author=1
- les quatre dates que surten és el datetime del sistema.
- post_excerpt: Seria el resum del post. Posem el mateix que el title
- post-name; és el post_title, passat a minúscules i substituïnt els espais en blanc per guions.
- guid: té la següent forma: http://www.mapesoberts.cat/index.php/2020/04/27/insert-post-SQL/. Per tant, haurem de concatenar la url amb l'any, el mes, el dia i el post_name. Tota aquesta informació la tenim.
script formulari_post.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<title>Insert into wp_posts</title>
</head>
<body>
<main>
<h1>Insert into wp_posts</h1>
<form name="form_însert_post" method="post" action="processar_insert.php" >
<p>
<label>Title Post</label><br />
<input type="text" name="title" placeholder="title">
</p>
<p>
<label>Post content</label><br />
<textarea name="content" placeholder="content" rows="4" cols="50"></textarea>
</p>
<button type="submit" name="submit">Enviar</button>
</form>
</html>
script processar_insert.php:
<?php
function stripAccents($str) {
return strtr(utf8_decode($str), utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'), 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
}
if (isset($_POST['submit'])) {
$title = str_replace("'","''",$_POST['title']);
$content = str_replace("'","''",$_POST['content']);
echo "<br />";
echo "Title: ".$title."<br />";
echo "content: ".$content."<br />";
}
/*
mysql> INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, guid, post_type, comment_count) VALUES (286, 1, '2020-04-27 13:00:00', '2020-04-27 13:00:00', 'Nou post a partir d''un insert SQL', 'insert post SQL', 'excerpt', 'publish', 'open', 'open', 'insert-post-SQL', '', '', '2020-04-27 13:00:00', '2020-04-27 13:00:00', '', 'http://www.mapesoberts.cat/index.php/2020/04/27/insert-post-SQL/', 'post', 0);
*/
$servername = "localhost";
$username = "alumne";
$password = "keiL2lai";
$dbname = "wordpress20";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
mysqli_query($conn, "SET NAMES 'utf8'");
$sql = "select max(ID) as max_id from wp_posts";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
if (!isset($row['max_id'])){
$vid=1;
} else {
$vid=$row['max_id']+1;
}
$dia = date("Y/m/d");
$dia_hora = date("Y-m-d H:i:s");
$post_name = str_replace(" ","-", stripAccents(strtolower($title)));
$sql = "INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, guid, post_type, comment_count) VALUES ($vid, 1, '$dia_hora', '$dia_hora', '$content', '$title', '$title', 'publish', 'open', 'open', '$post_name', '', '', '$dia_hora', '$dia_hora', '', 'http://www.mapesoberts.cat/index.php/$dia/$post_name/', 'post', 0)";
//echo $sql;
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
$sql = "INSERT INTO wp_term_relationships (object_id,term_taxonomy_id) VALUES ($vid, 1)";
//echo $sql;
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
//sleep(3);
//header('Location: contacte.html');
?>
Select
L'objectiu és mostrar un llistat de posts que hi ha a la base de dades, fent una select. Farem un formulari i així podrem filtrar per categoria.
Primer de tot llistem totes les categories que tenim en el bloc:
mysql> select name from wp_terms wpt, wp_term_taxonomy wptt where wpt.term_id=wptt.term_id and taxonomy='category'; +-------------------------+ | name | +-------------------------+ | General | | OpenStreetMaps | | Google Maps | | Món mapping | | comunitat | | importacions | | programació | | llibreries | | apps | | programació | | apps | | recursos | | Historia | | Districtes de Barcelona | | Fotografia | | Uncategorized | +-------------------------+ 16 rows in set (0.00 sec)
Per tal de filtrar tots els posts que tenim en una determinada categoria, per exemple programació, farem:
mysql> select post_title, guid from wp_posts wpp, wp_term_relationships wptr, wp_terms wpt where wpp.ID=wptr.object_id and wptr.term_taxonomy_id=wpt.term_id and wpt.name='programació'; +-----------------------------------------------------------------------+-----------------------------------+ | post_title | guid | +-----------------------------------------------------------------------+-----------------------------------+ | City Roads: mapes nets de text per a usar en tot tipus de dissenys | http://www.mapesoberts.cat/?p=61 | | City Roads: mapas limpios de texto para usar en todo tipo de diseños | http://www.mapesoberts.cat/?p=257 | | Camí de l'Àngel | http://www.mapesoberts.cat/?p=207 | | Camino del Ángel | http://www.mapesoberts.cat/?p=230 |
El que farem és un formulari on puguem escollir amb una llista desplegable una de les categories. I com a resultat mostrarem tots els posts que pertanyen a aquesta categoria, amb un enllaç per anar directament a llegir el post.
En aquest cas hem programat un sol script, llistar_posts.php, que inclou tant el formaulari (és una llista desplegable), com el processament del formulari, que és fer la consulta a la base de dades i mostrar el resultat.
script llistar_posts.php:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Filtrar posts per categoria</title>
</head>
<body>
<h1>Filtrar posts per categoria</h1>
<form name="llistar_posts" method="post" action="llistar_posts.php" >
<p>
<label>Categories</label><br />
<select name="categoria">
<option value="General">General</option>
<option value="OpenStreetMaps">OpenStreetMaps</option>
<option value="Món mapping">Món mapping</option>
<option value="Google Maps">Google Maps</option>
<option value="comunitat">comunitat</option>
<option value="importacions">importacions</option>
<option value="programació">programació</option>
<option value="llibreries">llibreries</option>
<option value="recursos">recursos</option>
<option value="Historia">Historia</option>
<option value="Districtes de Barcelona">Districtes de Barcelona</option>
<option value="Fotografia">Fotografia</option>
<option value="Uncategorized">Uncategorized</option>
</select>
</p>
<button type="submit" name="submit">Filtrar</button>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
echo "<h3>Resultat</h3>";
$categoria = $_POST["categoria"];
$servername = "localhost";
$username = "alumne";
$password = "keiL2lai";
$dbname = "wordpress20";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
mysqli_set_charset($conn,"utf8");
$sql = "select post_title, guid from wp_posts wpp, wp_term_relationships wptr, wp_terms wpt where wpp.ID=wptr.object_id and wptr.term_taxonomy_id=wpt.term_id and wpt.name='$categoria';";
//echo $sql;
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo "<ul class=\"list-group\">";
while($row = mysqli_fetch_assoc($result)) {
echo "<li>".$row["post_title"]." (<a href=\"".$row["guid"]."\">Enllaç</a>)</li>";
}
echo "</ul>";
} else {
echo "0 results";
}
mysqli_close($conn);
}
?>
</body>
</html>
Si ens fixem, el llistat de les categories en la llista desplegable està hardcoded, i això té l'inconvenient de què si afegim una nova categoria, hem de afegir-la també en el codi. Per fer-ho ben fet, s'hauria d'omplir la llista desplegable a partir dels valors que retorna la consulta a la base de dades. Ho podries fer?
Descarrega el codi
Feina a realitzar
1. El primer que has de fer és fer funcionar aquest codi en el teu Wordpress (captures de pantalla)
2. En aquests moments estàs fent un CMS de lliure elecció (joomla, mediawiki, prestashop, etc). Exceptuant algun cas, els alumnes esteu fent un CMS amb tecnologia PHP-MySQL, igual que el Wordpress. Per tant, tu que coneixes la teva base de dades, hauràs d'adaptar el codi per tal de què funcioni en el teu CMS. Ets lliure d'escollir les taules sobre les que treballaràs (per exemple, pots fer un formulari per inserir en la taula d'usuaris, en la taula de comentaris, en la taula de categories, etc, depèn del cas).
Entrega
Al Classroom
Entrega
creat per Joan Quintana Compte, abril 2020