Пользовательские запросы sql для wordpress

Source #Source

File: wp-includes/wp-db.php

	public function prepare( $query, ...$args ) {
		if ( is_null( $query ) ) {
			return;
		}

		// This is not meant to be foolproof -- but it will catch obviously incorrect usage.
		if ( strpos( $query, '%' ) === false ) {
			wp_load_translations_early();
			_doing_it_wrong(
				'wpdb::prepare',
				sprintf(
					/* translators: %s: wpdb::prepare() */
					__( 'The query argument of %s must have a placeholder.' ),
					'wpdb::prepare()'
				),
				'3.9.0'
			);
		}

		// If args were passed as an array (as in vsprintf), move them up.
		$passed_as_array = false;
		if ( is_array( $args ) && count( $args ) === 1 ) {
			$passed_as_array = true;
			$args            = $args;
		}

		foreach ( $args as $arg ) {
			if ( ! is_scalar( $arg ) && ! is_null( $arg ) ) {
				wp_load_translations_early();
				_doing_it_wrong(
					'wpdb::prepare',
					sprintf(
						/* translators: %s: Value type. */
						__( 'Unsupported value type (%s).' ),
						gettype( $arg )
					),
					'4.8.2'
				);
			}
		}

		/*
		 * Specify the formatting allowed in a placeholder. The following are allowed:
		 *
		 * - Sign specifier. eg, $+d
		 * - Numbered placeholders. eg, %1$s
		 * - Padding specifier, including custom padding characters. eg, %05s, %'#5s
		 * - Alignment specifier. eg, %05-s
		 * - Precision specifier. eg, %.2f
		 */
		$allowed_format = '(?:*)?*(?: |0|\'.)?*(?:\.+)?';

		/*
		 * If a %s placeholder already has quotes around it, removing the existing quotes and re-inserting them
		 * ensures the quotes are consistent.
		 *
		 * For backward compatibility, this is only applied to %s, and not to placeholders like %1$s, which are frequently
		 * used in the middle of longer strings, or as table name placeholders.
		 */
		$query = str_replace( "'%s'", '%s', $query ); // Strip any existing single quotes.
		$query = str_replace( '"%s"', '%s', $query ); // Strip any existing double quotes.
		$query = preg_replace( '/(?<!%)%s/', "'%s'", $query ); // Quote the strings, avoiding escaped strings like %%s.

		$query = preg_replace( "/(?<!%)(%($allowed_format)?f)/", '%\\2F', $query ); // Force floats to be locale-unaware.

		$query = preg_replace( "/%(?:%|$|(?!($allowed_format)?))/", '%%\\1', $query ); // Escape any unescaped percents.

		// Count the number of valid placeholders in the query.
		$placeholders = preg_match_all( "/(^||(%%)+)%($allowed_format)?/", $query, $matches );

		if ( count( $args ) !== $placeholders ) {
			if ( 1 === $placeholders && $passed_as_array ) {
				// If the passed query only expected one argument, but the wrong number of arguments were sent as an array, bail.
				wp_load_translations_early();
				_doing_it_wrong(
					'wpdb::prepare',
					__( 'The query only expected one placeholder, but an array of multiple placeholders was sent.' ),
					'4.9.0'
				);

				return;
			} else {
				/*
				 * If we don't have the right number of placeholders, but they were passed as individual arguments,
				 * or we were expecting multiple arguments in an array, throw a warning.
				 */
				wp_load_translations_early();
				_doing_it_wrong(
					'wpdb::prepare',
					sprintf(
						/* translators: 1: Number of placeholders, 2: Number of arguments passed. */
						__( 'The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d).' ),
						$placeholders,
						count( $args )
					),
					'4.8.3'
				);
			}
		}

		array_walk( $args, array( $this, 'escape_by_ref' ) );
		$query = vsprintf( $query, $args );

		return $this->add_placeholder_escape( $query );
	}

Произвольные поля (postmeta)

Удаляем ненужные произвольные поля

Стоял плагин и создавал себе произвольные поля, как вдруг — он стал не нужен и вы его удалили, а осиротелые, никому не нужные произвольные поля остались в Базе Данных. В такой или подобной ситуации, все произвольные поля с названием, например можно удалить таким простым SQL запросом:

DELETE pm FROM wp_postmeta pm WHERE pm.meta_key = 'meta_name'

Если название произвольного поля (meta_name) в кириллице, то убедитесь, чтобы кодировка файла из которого будет производиться SQL запрос соответствовала кодировке блога (обычно UTF-8 без BOM).

Получим все произвольные поля с пустым значением

Несмотря на то, что в админке создать произвольное поле не задав ему никакое значение не получится, по крайней мере стандартными средствами, такие «пустые» произвольные поля все же могут быть в вашей Базе Данных. Например, их могут оставить всякие там плагины или кривые руки. Чтобы посмотреть есть ли подобные поля и затем решить их судьбу, воспользуетесь таким SQL запросом:

SELECT *
FROM wp_postmeta pm
LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
WHERE wp.ID IS NULL

Произвольный SQL-запрос

$wpdb->query('query');

Проще простого, ведь так? А теперь Пример 1:

$wpdb->query(
    "
    DELETE FROM $wpdb->posts 
    WHERE post_type = 'revision'
    "
);
// удаляем все ревизии постов

Пример 2.используйте $wpdb->prepare, чтобы защититься от SQL-инъекций:

$id = 15; $key = "first_name"; $value = "Михаил";
 
$wpdb->query( $wpdb->prepare( 
    "
        INSERT INTO $wpdb->usermeta
        ( user_id, meta_key, meta_value )
        VALUES ( %d, %s, %s )
    ", 
    $id, 
    $key, 
    $value 
) );
// %s значит строка, %d - значит число
// добавляем имя пользователю с ID=15

Пример 3. также в качестве второго параметра можно использовать и массив:

$wpdb->query( $wpdb->prepare( 
    "
        INSERT INTO $wpdb->usermeta
        ( user_id, meta_key, meta_value )
        VALUES ( %d, %s, %s )
    ",
    array(
        $id, 
        $key, 
        $value 
    )
) );

更新记录

更新数据库的记录。

table 
(string) 要更新的表名称。
data 
(array) 需要更新的数据(使用格式:column => value)。Both $data columns and $data values should be «raw» (neither should be SQL escaped).
where 
(array) A named array of WHERE clauses (in column => value pairs). Multiple clauses will be joined with ANDs. Both $where columns and $where values should be «raw».
format 
(array|string) (optional) An array of formats to be mapped to each of the values in $data. If string, that format will be used for all of the values in $data.
where_format 
(array|string) (optional) An array of formats to be mapped to each of the values in $where. If string, that format will be used for all of the items in $where.

Possible format values: %s as string; %d as decimal number and %f as float. If omitted, all values in $where will be treated as strings.

示例

更新ID为1的行,第一列的值为字符串,第二列的值为数组:

$wpdb->update( 'table', array( 'column1' => 'value1', 'column2' => 'value2' ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )

get_row

Получает значения только из одной строки, удовлетворяющей условию.

$wpdb->get_row('query', output_type, row_offset);
  • output_type — тип вывода данных,
    • OBJECT — объект (по умолчанию),
    • ARRAY_A — ассоциативный массив,
    • ARRAY_N — нумерованный массив;
  • row_offset — (целое) номер по порядку нужного ряда (по умолчанию 0)

Пример 1.выводим заголовок поста с самым большим количеством комментариев:

$post = $wpdb->get_row(
    "
    SELECT post_title, post_content
    FROM $wpdb->posts
    WHERE post_status = 'publish'
    ORDER BY comment_count DESC LIMIT 0,1
    "
);
echo $post->title;

Пример 2.используем для тех же целей ассоциативный массив:

$post = $wpdb->get_row(
    "
    SELECT post_title, post_content
    FROM $wpdb->posts
    WHERE post_status = 'publish'
    ORDER BY comment_count DESC LIMIT 0,1
    ",
    ARRAY_A
);
echo $post'title';

Adding an Upgrade Function

Over the lifetime of your plugin, you may find that you need to change the plugin’s database structure in an upgraded version. To do that, you will need to create update code within your plugin that will detect that a new version has been installed, and upgrade the database structure. The easiest thing to do is to add the code to the jal_install function we just created.

So, let’s assume that the function above was used to create database version 1.0 of your plugin, and you are now upgrading to version 1.1 so that the URL field can be wider (100 characters instead of 55). You will need to add the following lines to the end of your jal_install function, to check the version and upgrade if necessary:

<?php

global $wpdb;
$installed_ver = get_option( "jal_db_version" );

if ( $installed_ver != $jal_db_version ) {

	$table_name = $wpdb->prefix . 'liveshoutbox';

	$sql = "CREATE TABLE $table_name (
		id mediumint(9) NOT NULL AUTO_INCREMENT,
		time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
		name tinytext NOT NULL,
		text text NOT NULL,
		url varchar(100) DEFAULT '' NOT NULL,
		PRIMARY KEY  (id)
	);";

	require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
	dbDelta( $sql );

	update_option( "jal_db_version", $jal_db_version );
}

You’ll also need to change the global $jal_db_version variable at the top of the file, and of course you’ll want to change the initialization section created above to use the new table structure.

Since 3.1 the activation function registered with register_activation_hook() is not called when a plugin is updated. So to run the above code after the plugin is upgraded, you need to check the plugin db version on another hook, and call the function manually if the the database version is old. Like this:

function myplugin_update_db_check() {
    global $jal_db_version;
    if ( get_site_option( 'jal_db_version' ) != $jal_db_version ) {
        jal_install();
    }
}
add_action( 'plugins_loaded', 'myplugin_update_db_check' );

防止SQL查询注入攻击

For a more complete overview of SQL escaping in WordPress, see . That Data Validation article is a must-read for all WordPress code contributors and plugin authors.

query 
(string) The SQL query you wish to execute, with and placeholders. Any other characters may cause parsing errors unless they are escaped. All characters inside SQL string literals, including LIKE wildcards, must be double-% escaped as .
value_parameter 

示例

Add Meta key => value pair «Harriet’s Adages» => «WordPress’ database interface is like Sunday Morning: Easy.» to Post 10.

$metakey = "Harriet's Adages";
$metavalue = "WordPress' database interface is like Sunday Morning: Easy.";

$wpdb->query( $wpdb->prepare( "
	INSERT INTO $wpdb->postmeta
	( post_id, meta_key, meta_value )
	VALUES ( %d, %s, %s )", 
        10, $metakey, $metavalue ) );

Performed in WordPress by .

$metakey = "Harriet's Adages";
$metavalue = "WordPress' database interface is like Sunday Morning: Easy.";

$wpdb->query( $wpdb->prepare( "
	INSERT INTO $wpdb->postmeta
	( post_id, meta_key, meta_value )
	VALUES ( %d, %s, %s )", 
        array(10, $metakey, $metavalue) ) );

Note that in this example we pack the values together in an array. This can be useful when we don’t know the number of arguments we need to pass until runtime.

Notice that you do not have to worry about quoting strings. Instead of passing the variables directly into the SQL query, use a placeholder for strings and a placedolder for integers. You can pass as many values as you like, each as a new parameter in the method.

Статусы

Определена, при выполнении запроса Atom Publishing Protocol.Может быть:
Определена, когда загружается шаблон комментариев.Может быть:
Определена при выполнении AJAX запроса.Может быть:
Определена при автосохранении записи.Может быть:
Определена, если выполняется cron задача (задача по расписанию).Может быть:
Определена при выполнении IFRAME запроса.Может быть:
Определена, если вы находитесь на странице редактирования профиля в админ-панели.Может быть:
при выполнении REST запроса.Может быть:
true — останавливает загрузку основной части WordPress. Можно использовать, если нужны только базовые функции. Подключение к БД будет уже установлено ($wpdb будет определена). Фильтры также, уже определены. Константа вызывается в файле wp-settings.php.Может быть:
Определена, если вы находитесь в админ-панели WordPress.Может быть:
Будет определена, если выполняется запрос в /wp-admin/.Может быть:
Определена при импорте данных WordPress.Может быть:
Будет определена, во время новой инсталляции или обновлении.Может быть:
Определена при установке сети или при запросе к network admin. С версии 3.3. До этого была: WP_NETWORK_ADMIN_PAGE.Может быть:
Определена при обзоре импорта в панели управления (Tools -> Importer).Может быть:
Определена на странице: /wp-admin/network/.Может быть:
Определена на странице: /wp-admin/maint/repair.php.Может быть:
Определена при установке или конфигурации WP.Может быть:

Определена во время удаления плагина. Для удаления плагина создается файл uninstall.php в его папке, при удалении срабатывает код из этого файла, так вот чтобы не возникло никаких неожиданностей в этом файле нужно делать проверку на существование константы WP_UNINSTALL_PLUGIN — она должна быть определена во время удаления плагина.

Пример проверки:

if( ! defined('WP_UNINSTALL_PLUGIN') exit();
// код удаления прибывания плагина на сайте

Может быть:

Определена на страницах: /wp-admin/user/.Может быть:
Определена при любом XML-RPC запросе.Может быть:

Related #Related

Uses

Uses
Uses
wp-includes/taxonomy.php:
saved_term
wp-includes/taxonomy.php:
saved_{$taxonomy}
wp-includes/taxonomy.php:
wp_update_term_data
wp-includes/taxonomy.php:
edit_terms
wp-includes/taxonomy.php:
edited_terms
wp-includes/l10n.php:
__()
wp-includes/formatting.php:
wp_slash()
wp-includes/formatting.php:
wp_unslash()
wp-includes/formatting.php:
sanitize_title()
wp-includes/functions.php:
wp_parse_args()
wp-includes/taxonomy.php:
clean_term_cache()
wp-includes/taxonomy.php:
wp_update_term()
wp-includes/taxonomy.php:
wp_unique_term_slug()
wp-includes/taxonomy.php:
wp_update_term_parent
wp-includes/taxonomy.php:
edit_term_taxonomy
wp-includes/taxonomy.php:
edited_term_taxonomy
wp-includes/taxonomy.php:
edit_term
wp-includes/taxonomy.php:
edit_{$taxonomy}
wp-includes/taxonomy.php:
edited_term
wp-includes/taxonomy.php:
edited_{$taxonomy}
wp-includes/taxonomy.php:
term_id_filter
wp-includes/taxonomy.php:
sanitize_term()
wp-includes/taxonomy.php:
term_exists()
wp-includes/taxonomy.php:
get_term_by()
wp-includes/taxonomy.php:
taxonomy_exists()
wp-includes/taxonomy.php:
get_term()
wp-includes/plugin.php:
apply_filters()
wp-includes/plugin.php:
do_action()
wp-includes/wp-db.php:
wpdb::get_var()
wp-includes/wp-db.php:
wpdb::update()
wp-includes/wp-db.php:
wpdb::prepare()
wp-includes/load.php:
is_wp_error()
wp-includes/class-wp-error.php:
WP_Error::__construct()

get_results

Первый метод больше всего похож на обычный запрос SELECT.

$wpdb->get_results('query', output_type);
  • output_type — тип вывода данных
    • OBJECT — объект (по умолчанию),
    • OBJECT_K — ассоциативный массив, в котором в качестве ключей будут использоваться значения в первой колонке, дубликаты будут проигнорированы,
    • ARRAY_A — нумерованный массив состоящий из ассоциативных массивов, в качестве индексов которых будут использоваться названия колонок,
    • ARRAY_N — нумерованный двумерный массив;

Пример 1. выводим заголовки всех опубликованных страниц:

$pages = $wpdb->get_results( 
    "
    SELECT post_title, post_content 
    FROM $wpdb->posts
    WHERE post_status = 'publish' 
    AND post_type = 'page'
    "
);
/* вытаскивает из базы данных заголовки и содержимое
всех опубликованных страниц */
if( $pages ) {
    foreach ( $pages as $page ) {
        echo $page->post_title;
    }
}
// выводим заголовки
$pages = $wpdb->get_results( 
    "
    SELECT * 
    FROM $wpdb->posts
    WHERE post_status = 'publish' 
    AND post_type = 'page'
    "
);
if ( $pages ) {
    foreach ( $pages as $post ) {
        setup_postdata( $post );
        ?>
        <h1>
            <a href="<?php the_permalink(); ?>">
                <?php the_title(); ?>
            </a>
        </h1>
        <?php
    }
    else
    {
        ?>
        <h1>Ничего не найдено</h1>
        <?php
    }
}
/* В случае если на блоге есть опубликованные страницы,
выводим заголовок со ссылкой на саму страницу */

数据表

The WordPress database tables are easily referenced in the class.

$posts 
文章表
$postmeta 
The (a.k.a. Custom Fields) table.
$comments 
评论表
$commentmeta 
The table contains additional comment information.
$terms 
The table contains the ‘description’ of Categories, Link Categories, Tags.
$term_taxonomy 
The table describes the various taxonomies (classes of terms). Categories, Link Categories, and Tags are taxonomies.
$term_relationships 
The table contains link between the term and the object that uses that term, meaning this file point to each Category used for each Post.
$users 
用户表
$usermeta 
The table contains additional user information, such as nicknames, descriptions and permissions.
$links 
链接表
$options 
The table.

Комментарии

Частенько бывает нужно массово закрыть или открыть комментарии или сделать что-то еще с комментариями. Для таких манипуляций можно использовать следующие SQL запросы:

Удаление спам комментариев

Некоторые антиспам плагины, пропускают все комменты, но подозрительные помечают как спам, чтобы, если это не так, потом можно было одобрить комментарий. Например, так делает хваленный Akismet (никогда им не пользовался, он действительно так хорош?). Если спам комментов собралось большое множество, то чистить весь этот мусор руками никак не идет в сравнение с использованием такого простого SQL запроса:

DELETE FROM wp_comments WHERE comment_approved = 'spam'

Если нужно удалить все не одобренные комментарии, используйте:

DELETE FROM wp_comments WHERE comment_approved = 0
Удалим URL у всех комментариев

Чтобы очистить значения поля URL у всех комментариев, можно использовать такой запрос:

UPDATE wp_comments SET comment_author_url=''
Закрыть комментарии в рубрике

Если нужно закрыть комментарии только в какой-то одной рубрике, можно использовать такой SQL запрос, который разом закроет возможность комментирования для всех постов из рубрики, например, (альтернативное название рубрики, слаг):

UPDATE wp_posts p
    LEFT JOIN wp_term_relationships rel ON ( p.ID = rel.object_id )
    LEFT JOIN wp_term_taxonomy tax ON ( tax.term_taxonomy_id = rel.term_taxonomy_id  )
    LEFT JOIN wp_terms tm ON ( tm.term_id = tax.term_id )
SET p.comment_status = 'closed'
WHERE tm.slug = 'stat'

— рубрика в которой мы закрываем комментарии.

Закрыть комментирование в старых постах

Чтобы закрыть возможность оставлять комментарии для старых постов, допустим, опубликованных до 1 января 2010 года, можно использовать такой SQL запрос:

UPDATE wp_posts SET comment_status = 'closed'
WHERE post_date < '2010-01-01' AND post_status = 'publish'

где, как вы догадались, — дата позднее которой комменты будут закрыты.

Удаление комментариев с плохими УРЛами

Можно удалить комментарии по маске, например, если в УРЛе комментатора встречается сочетание букв :

DELETE a,b
FROM wp_comments a
	LEFT JOIN wp_commentmeta b ON ( a.comment_ID = b.comment_id )
WHERE
	a.comment_author_url LIKE '%poker%'
Изменение сайта комментатора

Теоретически УРЛ, который указывает комментатор в поле «сайт» можно изменить при редактировании комментария, но если комментариев этого комментатора много, то везде изменять УРЛ — занятие для обезьянок, проще запросом:

UPDATE wp_comments SET comment_author_url = 'http://example.com'
WHERE comment_author = 'Kama'
AND comment_author_email = 'kama@gmail.com'

Еще один вариант аналогичный предыдущему примеру. Заменит все совпадения на , в УРЛах всех комментаторов:

UPDATE wp_comments
SET comment_author_url = REPLACE( comment_author_url, 'old-site.ru', 'new-site.ru' )
Меняем ID родительского комментария

Иногда пользователи некорректно постят древовидные комментарии — отвечая на коммент не используют кнопку «ответить» в итоге получается, что ответ теряется. Чтобы исправить эту ситуацию можно изменить ID родительского коментария, чтобы правильно расположить новый коммент в дереве:

UPDATE wp_comments SET comment_parent=21 WHERE comment_ID=97

21 — родительский комментарий, 97 — комментарий который нужно поправить.

E-mail’ы комментаторов

Чтобы собрать все мылы комментаторов, например, чтобы сделать какую-нибудь рассылку, можно использовать такой SQL запрос:

SELECT DISTINCT comment_author_email FROM wp_comments

Related #Related

Uses

Uses
Uses
wp-includes/load.php:
wp_installing()
wp-includes/cache.php:
wp_cache_get()
wp-includes/cache.php:
wp_cache_set()
wp-includes/l10n.php:
__()
wp-includes/formatting.php:
sanitize_option()
wp-includes/functions.php:
_deprecated_argument()
wp-includes/functions.php:
maybe_serialize()
wp-includes/plugin.php:
apply_filters()
wp-includes/plugin.php:
do_action()
wp-includes/option.php:
update_option()
wp-includes/option.php:
add_option()
wp-includes/option.php:
wp_load_alloptions()
wp-includes/option.php:
pre_update_option_{$option}
wp-includes/option.php:
pre_update_option
wp-includes/option.php:
update_option
wp-includes/option.php:
update_option_{$option}
wp-includes/option.php:
updated_option
wp-includes/option.php:
wp_protect_special_option()
wp-includes/option.php:
get_option()
wp-includes/option.php:
default_option_{$option}
wp-includes/wp-db.php:
wpdb::update()

Смена домена

Исправляем домен в опциях

При переезде на другой домен, помимо того, что нужно заменить домен везде где он встречается в шаблоне, также нужно изменить записи в Базе Данных в двух местах, в таблице опций (wp_options):

UPDATE wp_options SET option_value = 'http://example.com/'
WHERE option_name = 'home' OR option_name = 'siteurl'

Запрос меняет значение полей и . Не забудьте поменять на ваш новый домен!

Исправляем домен в записях

При смене домена, надо позаботится и о том, чтобы в постах были правильные внутренние ссылки, т.е. ссылки из статей на другие статьи блога, после смены домена станут битыми. Обычно конечно настраивается перенаправление со старого домена на новый в .htaccess или PHP с 301 редиректом, но помимо этого эстетически правильно, если в статьях не будет ссылок на старый домен. Этим запросом мы заменим все виды ссылок, включая ссылки на картинки:

UPDATE wp_posts
SET post_content = REPLACE (post_content, 'http://old-site.ru', 'http://new-site.ru')

old-site.ru и new-site.ru старый и новые домены, соответственно. Не забудьте изменить.

Аналогично можно поменять любую строку, например, слово на . См. пример ниже.

Меняем домен в произвольных полях

В произвольных полях также могут быть записи хранящие какие-либо УРЛы на старый домен, поэтому при смене домена возможно нужно заменить домен и в произвольных полях:

UPDATE wp_postmeta
SET meta_value = REPLACE (meta_value, 'http://old-site.ru','http://new-site.ru')
Редактируем GUID

При смене домена сайта желательно позаботиться о том, чтобы у всех записей поле в таблице было корректное.

Это поле используется как уникальный ID для идентификации записи в RSS ленте. Также, поговаривают, что оно нужно для корректного перенаправления с некорректных УРЛов, но это не так — я проверял

UPDATE wp_posts
SET guid = REPLACE (guid, 'http://www.oldblog.ru', 'http://www.newblog.ru')

Для некоторых проектов я использую поле guid для других целей и для обновления этого поля я написал мини-плагин.

Защита и куки

Путь к каталогу /wp-admin/По умолчанию:
Позволяет включить загрузку файлов без фильтрования, пользователем с правом . Включает работу права . Если не включить эту константу, то юзеры с правом не будут проходить проверку current_user_can(‘unfiltered_upload’).Может быть:
Имя Cookie для авторизацииПо умолчанию:
Секретный ключМожет быть:
Добавка к секретному ключуМожет быть:
Хэш для генерации имен cookie
Путь к корневому каталогу WordPress.По умолчанию:
Домен который будет использоваться в setcookie() и для которого будут устанавливаться куки. По умолчанию это текущий домен, можно указать конкретный домен, например .site.ru, тогда куки будут действительны для домена site.ru и всех поддоменов: foo.site.ru, bar.site.ruПо умолчанию:
Позволяет переопределять список защитных меток HTML. Смотреть в /wp-includes/kses.php.Может быть: По умолчанию:
Позволяет запретить редактирование тем и плагинов с использованием редактора WordPress.Может быть:

Запрещает любое редактирование файлов в файловой системе WordPress (кроме директории для загрузок wp-content/uploads):

define( 'DISALLOW_FILE_MODS', true );

Учтите, что установив эту директиву вы больше не сможете устанавливать и обновлять темы и плагины через панель администратора. Вам придётся это делать вручную с помощью FTP или SSH.

Может быть:

Позволяет запретить не фильтрованные HTML для всех пользователей, включая админа. Некоторые привилегии можно отключить на уровне
конфигурационного файла wp-config.php, например можно запретить всем пользователям (включая администраторов и сетевых администраторов) публиковать не фильтрованный HTML с помощью:

define( 'DISALLOW_UNFILTERED_HTML', true );

Может быть:

Активирует SSL для админки и в панели управления.Может быть: По умолчанию:
Активирует SSL для страницы входа.Может быть: По умолчанию:
Имя Cookie для авторизации.По умолчанию:
Секретный ключМожет быть:
Секретный ключМожет быть:
Секретный ключМожет быть:
Секретный ключМожет быть:
Имя Cookie для пароляПо умолчанию:
Путь к каталогу плагиновПо умолчанию:
Имя Cookie для SSL авторизацииПо умолчанию:
Секретный ключМожет быть:
Секретный ключМожет быть:
Путь к сайтуПо умолчанию:
Имя Cookie для тестового cookieПо умолчанию:
Имя Cookie для пользователейПо умолчанию:

Validation Philosophies

There are several different philosophies about how validation should be done. Each is appropriate for different scenarios.

Safelist

Accept data only from a finite list of known and trusted values.

When comparing untrusted data against the safelist, it’s important to make sure that strict type checking is used. Otherwise an attacker could craft input in a way that will pass the safelist but still have a malicious effect.

switch()

Format Detection

Test to see if the data is of the correct format. Only accept it if it is.

if ( ! ctype_alnum( $data ) ) {
  wp_die( "Invalid format" );
}

if ( preg_match( "//", $data ) ) {
  wp_die( "Invalid format" );
}
$trusted_integer = (int) $untrusted_integer;
$trusted_alpha = preg_replace( '//i', "", $untrusted_alpha );
$trusted_slug = sanitize_title( $untrusted_slug );

选择一列

To SELECT a column, use . This function outputs a dimensional array. If more than one column is returned by the query, only the specified column will be returned by the function, but the entire result is cached for later use. Returns an empty array if no result is found.

query 
(string) the query you wish to execute. Setting this parameter to will return the specified column from the cached results of the previous query.
column_offset 
(integer) The desired column ( being the first). Defaults to .

示例

For this example, assume the blog is devoted to information about automobiles. Each post describes a particular car (e.g. 1969 Ford Mustang), and three Custom Fields, manufacturer, model, and year, are assigned to each post. This example will display the post titles, filtered by a particular manufacturer (Ford), and sorted by model and year.

<?php 
$meta_key1 = 'model';
$meta_key2 = 'year';
$meta_key3 = 'manufacturer';
$meta_key3_value = 'Ford';

$postids=$wpdb->get_col($wpdb->prepare("
SELECT      key3.post_id
FROM        $wpdb->postmeta key3
INNER JOIN  $wpdb->postmeta key1 
            on key1.post_id = key3.post_id
            and key1.meta_key = %s 
INNER JOIN  $wpdb->postmeta key2
            on key2.post_id = key3.post_id
            and key2.meta_key = %s
WHERE       key3.meta_key = %s 
            and key3.meta_value = %s
ORDER BY    key1.meta_value, key2.meta_value",$meta_key1, $meta_key2, $meta_key3, $meta_key3_value)); 

if ($postids) {
  echo 'List of ' . $meta_key3_value . '(s), sorted by ' . $meta_key1 . ', ' . $meta_key2;
  foreach ($postids as $id) { 
    $post=get_post(intval($id));
    setup_postdata($post);?>
    <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
    <?php
  } 
}
?>

This example lists all posts that contain a particular custom field, but sorted by the value of a second custom field.

<?php
//List all posts with custom field Color, sorted by the value of custom field Display_Order
//does not exclude any 'post_type'
//assumes each post has just one custom field for Color, and one for Display_Order
$meta_key1 = 'Color';
$meta_key2 = 'Display_Order';

$postids=$wpdb->get_col($wpdb->prepare("
SELECT      key1.post_id
FROM        $wpdb->postmeta key1
INNER JOIN  $wpdb->postmeta key2
            on key2.post_id = key1.post_id
            and key2.meta_key = %s
WHERE       key1.meta_key = %s
ORDER BY    key2.meta_value+(0) ASC",
         $meta_key2,$meta_key1)); 

if ($postids) {
  echo 'List of '. $meta_key1  . ' posts, sorted by ' . $meta_key2 ;
  foreach ($postids as $id) {
    $post=get_post(intval($id));
    setup_postdata($post);?>
    <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
    <?php
  }
}
?>
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector