Problém fulltextovým vyhledáváním

Při pokusu implementovat fulltextové vyhledávání via MySQL InnoDB jsem narazil na problém. Vyhledávání se aplikovalo pouze na jeden sloupec databáze.

Má funkce v modelu, kterou jsem udělal podle návodu od Martina Zlámala vypadá takto:

public function search($search)
{
$where = "";
//$ft_min_word_len = mysql_result(mysql_query("SHOW VARIABLES LIKE 'ft_min_word_len'"), 0, 1);
$ft_min_word_len = 4;
preg_match_all("~[\\pL\\pN_]+('[\\pL\\pN_]+)*~u", stripslashes($search), $matches);
foreach ($matches[0] as $part) {
    if (iconv_strlen($part, "utf-8") < $ft_min_word_len) {
        $regexp = "REGEXP '[[:<:]]" . addslashes(strtoupper($part)) . "[[:>:]]'";
        $where .= " OR (title $regexp OR content $regexp)";
    }
}
 
return $this->database->table('articles')
->where("MATCH(title, content) AGAINST (? IN BOOLEAN MODE)$where", $search)
->order("5 * MATCH(title) AGAINST (?) + MATCH(content) AGAINST (?) DESC", $search, $search)
->limit(50);
}

Řešení:

Problém byl ,že jsem měl nastavené pouze FULLTEXTOVÉ klíče “title” a “content”. Po přidání FULLTEXTOVÉHO klíče “title, content” byl problém vyřešen.

Nette – přístup k databázi bez PDO

Určitě nebudu sám, koho štvou nejrůznější komplikace při přesunu projektu z localu na hosting.
Rád bych se zde podělil o jednu zkušenost, která snad někomu usnadní práci a případně někdo poradí, jak a co udělat lépe.

Tedy problém byl, že na hostingu nebyla knihovna php_pdo_mysql. Na locale ,kde tuto knihovnu mám, mi vše s NetteDatabase jelo v pohodě, ale na locale jsem se nemohl k DB připojit.

Něco jsem pročetl na fórech a zjistil jsem, že snad s dibi by neměl být problém.

Tedy jsem si config.neon a authenticator musel přepsat pro dibi. Zde jsou:

config.neon

common:
    php:
        date.timezone: Europe/Prague
 
    services:
        database:
            class: DibiConnection
            arguments: [ {driver: %database.driver%, charset: utf8, hostname: %database.host%, username: %database.user%, password: %database.password%, database: %database.dbname%, persistent: true, lazy: true} ]
 
        authorizator:
            class: AclProjSecurityAcl
 
        authenticator:
            class: AclProjSecurityAuthenticator
            arguments: [@database, %security.salt%]
 
development < common:
    parameters:
        database:
            driver : mysql
            host : localhost
            dbname : ...
            user : ...
            password: ...
 
        security:
            salt: zb1g7IHt1I
 
production < common:
    parameters:
        database:
            driver : mysql
            host : localhost
            dbname : ...
            user : ...
            password: ...
 
        security:
            salt: zb1g7IHt1I

Authenticator.php

db = $dbConnection;
        $this->passwordSalt = $salt;
    }
 
    public function authenticate(array $credentials)
    {
        $email    = $credentials[self::USERNAME];
        $password = sha1($credentials[self::PASSWORD] . $this->passwordSalt);
 
        $user = $this->db
                ->select('*')
                ->from('user')
                ->where('email=%s', $email)
                ->fetch();
 
        if (!$user) {
            throw new AuthenticationException("User with login email '$email' not found", self::IDENTITY_NOT_FOUND);
        }
        if ($user->password != $password) {
            throw new AuthenticationException('Wrong password', self::INVALID_CREDENTIAL);
        }
 
        $identity = new Identity($user->id, $user->role);
        $identity->name = $user->name;
        $identity->email = $user->email;
 
        return $identity;
    }
 
}

Snad to pomůže, nakopne, inspiruje a hlavně zkrátí někomu dalšímu ztracený čas. Musel jsem také upravovat všechny dotazy na DB v modelu pro dibi. Nonaštěstí jsem toho neměl moc.

Moc se v tomto neorientuji, tak budu rád za jakoukoliv dobrou radu do budoucna a případnou debatu na toto téma.

Užitečné tipy pro wordpress

Seznam užitečných tipů, které usnadní práci a vývoj v redakčním systému wordpress:

Shortcode
Lze využít pro uživatelské vkládání nejrůznějšího obsahu přímo do postu, stránek.
Nejdříve si v souboru function.php vytvoříme a zaregistrujeme libovolnou funkci, kterou chceme aplikovat a vložit do článku.

function hello() {
    return 'Hello, World!';
}
 
add_shortcode('nase_fce', 'hello');

Následně můžeme naši fci volat při tvorbě příspěvku:

[nase_fce]

Interakce s DB

Získání záznamů:

<!--?php    $posts = $wpdb--->get_results("SELECT ID, post_title FROM wp_posts WHERE post_status = 'future'
   AND post_type='post' ORDER BY post_date ASC LIMIT 0,4")
 
   // Echo the title of the first scheduled post
   echo $posts[0]-&gt;post_title;
?&gt;

Získání řádku:

<!--?php    $posts = $wpdb--->get_row("SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,1")
 
   // Echo the title of the most commented post
   echo $posts-&gt;post_title;
?&gt;

Získání sloupce:

<!--?php    $posts = $wpdb--->get_col("SELECT ID FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,10")
 
   // Echo the ID of the 4th most commented post
   echo $posts[3]-&gt;ID;
?&gt;

Získání konkrétní hodnoty:

<!--?php    $email = $wpdb--->get_var("SELECT user_email FROM wp_users WHERE user_login = 'danielpataki' ")
 
   // Echo the user's email address
   echo $email;
?&gt;

Vložení dat do DB:

$wpdb-&gt;insert( $table, $data, $format);

Vložení dat do DB ukázka:

<!--?php    $wpdb--->insert($wpdb-&gt;usermeta, array("user_id" =&gt; 1, "meta_key" =&gt; "awesome_factor", "meta_value" =&gt; 10), array("%d", %s", "%d"));
 
   // Equivalent to:
   // INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES (1, "awesome_factor", 10);
?&gt;

Update dat v DB

$wpdb-&gt;update( $table, $data, $where, $format = null, $where_format = null );

Update dat v DB ukázka:

$wpdb-&gt;update( $wpdb-&gt;posts, array("post_title" =&gt; "Modified Post Title"), array("ID" =&gt; 5), array("%s"), array("%d") );

Vložení vlastního loga na loginpage

add_action( 'login_head', 'ilc_custom_login');
function ilc_custom_login() {
	echo '<style type="text/css">
	h1 a { background-image:url('. get_stylesheet_directory_uri() . '/images/login-logo.png' . ') !important; margin-bottom: 10px; }
	padding: 20px;}
	</style>
	<script type="text/javascript">window.onload = function(){document.getElementById("login").getElementsByTagName("a")[0].href = "'. home_url() . '";document.getElementById("login").getElementsByTagName("a")[0].title = "Go to site";}</script>';
}

Změna počtu skov v excerpt funkci

add_filter('excerpt_length', 'ilc_excerpt_length');
function ilc_excerpt_length( $length ){
	return 10;
}